- O patch corrige o erro de "sleeping function" que causava instabilidade em sistemas de tempo real rodando o Kernel Linux 7.0.
- A mudança impacta positivamente servidores de áudio e automação industrial que dependem do patch de performance PREEMPT_RT.
- Tejun Heo implementou o uso de irq_work para adiar a limpeza de tarefas, evitando travamentos em seções críticas do código.
- O subsistema cgroup agora lida com o encerramento de processos de forma assíncrona para manter o determinismo do sistema.
- A atualização deve chegar às distribuições estáveis e dispositivos embarcados ao longo de 2026 após testes de regressão.
Tejun Heo, um dos principais mantenedores do subsistema de grupos de controle, enviou uma correção crítica para o Kernel Linux 7.0 que resolve avisos de “sleeping function called from invalid context”. A mudança foca especificamente em sistemas rodando com o patch PREEMPT_RT, garantindo que o encerramento de tarefas não cause travamentos ou instabilidades em ambientes que exigem latência determinística.
O que isso significa na prática
Em computadores comuns, o sistema operacional pode pausar uma tarefa por um milissegundo para dar atenção a outra sem que você perceba. No entanto, em sistemas de tempo real — como os que controlam robôs industriais, sistemas médicos ou equipamentos de áudio profissional — essas pausas inesperadas são inaceitáveis. O patch corrige um erro onde o Kernel tentava realizar uma limpeza burocrática de processos em um momento proibido, o que disparava alertas de erro. Agora, essa limpeza é agendada para um momento posterior, permitindo que o sistema continue fluido, estável e previsível.
Detalhes da implementação
O problema central residia na função cgroup_task_dead(), que é disparada dentro de finish_task_switch(). Este é um dos contextos mais sensíveis do Kernel, onde a preempção é desabilitada. No Kernel Linux 7.0, a tentativa de adquirir o css_set_lock — um spinlock comum — causava conflitos em kernels RT, pois esses locks podem entrar em estado de espera (sleep), algo estritamente proibido naquele ponto exato do código.
A solução inicial de transformar o lock em um raw_spinlock foi descartada após revisores apontarem que as seções críticas eram extensas demais e envolviam liberações de memória (kfree), o que degradaria a performance. A implementação final utiliza irq_work para adiar a desconexão do processo do seu cgroup. Em sistemas PREEMPT_RT, o trabalho é movido para uma fila assíncrona, sendo executado assim que o hardware sai do contexto crítico de troca de tarefas.
Curiosidades e bastidores da discussão
A discussão na LKML revelou a complexidade de manter o subsistema cgroup em harmonia com o código de escalonamento. Calvin Owens, que reportou o erro originalmente, desencadeou um debate técnico de alto nível entre Tejun Heo e especialistas em tempo real como Sebastian Andrzej Siewior e Peter Zijlstra.
O ponto crucial foi a percepção de que a limpeza dos grupos de controle não precisa ser instantânea; ela só precisa acontecer antes que a estrutura da tarefa seja completamente destruída. Contudo, a correção trouxe novos desafios: o usuário Bert Karwatzki reportou posteriormente que a mudança causou um atraso de 90 segundos no desligamento de certos notebooks MSI, mostrando que no desenvolvimento do Kernel Linux, a solução de um problema de latência pode, às vezes, criar gargalos inesperados em outras áreas do sistema.
Quando isso chega no meu PC?
A correção já faz parte da base de código do Kernel Linux 7.0 e está sendo refinada para evitar os efeitos colaterais relatados em hardwares específicos. Para usuários de distribuições focadas em estabilidade, como Debian ou RHEL, o recurso deve chegar no segundo semestre de 2026. Usuários de distribuições rolling release como Arch Linux ou Fedora devem receber a atualização assim que a versão estável for oficializada, o que está previsto para ocorrer após a conclusão da atual janela de mesclagem (Merge Window).
