Bug de hotplug de bateria que causava erros de “arquivo duplicado” no sysfs é corrigido no Linux

Escrito por
Emanuel Negromonte
Emanuel Negromonte é Jornalista, Mestre em Tecnologia da Informação e atualmente cursa a segunda graduação em Engenharia de Software. Com 14 anos de experiência escrevendo sobre...

Menos barulho no dmesg, mais estabilidade ao reconectar a bateria.

Se você já removeu e reinseriu a bateria do seu laptop rapidinho e viu mensagens esquisitas no dmesg — tipo “sysfs: cannot create duplicate filename” — boa notícia: uma correção está a caminho. Um novo patch para o driver de ACPI no kernel do Linux elimina uma race condition (condição de corrida) que gerava avisos e erros ao reconectar a bateria em sequência. Em outras palavras: menos barulho nos logs e um manuseio de hotplug mais confiável.

O que o usuário via nos logs

O sintoma era bem chato: ao recolocar a bateria logo após removê-la, o sistema recebia eventos quase simultâneos do firmware ACPI e tentava registrar o mesmo dispositivo de energia duas vezes no sysfs — daí o erro de “arquivo duplicado” e o famoso -EEXIST. Além do incômodo, isso poluía o log com stack traces e avisos, o que não ajuda em nada quando você está tentando depurar outros problemas.

9ok6lbfj image 1
Bug de hotplug de bateria que causava erros de “arquivo duplicado” no sysfs é corrigido no Linux 3

Uma corrida para registrar a bateria

Qual a causa? O firmware manda duas notificações quase ao mesmo tempo; ambas disparam o fluxo que registra a bateria (via sysfs_add_battery()), e — sem coordenação — as duas podem entrar juntas na função. Resultado: duas tentativas de criar o mesmo nó power_supply/BAT* em paralelo. É aquele clássico cenário de race condition: quem chega primeiro? E se chegam juntas?

A correção: um cadeado no lugar certo

A solução enviada por GuangFei Luo foi simples e eficaz: colocar um “cadeado” (um mutex) dentro de sysfs_add_battery(). Com esse bloqueio, apenas uma execução por vez pode prosseguir; a segunda encontra o trabalho já feito (ou espera o cadeado), evitando o registro duplicado. O patch também simplifica os chamadores: como a checagem agora é centralizada e protegida, os if (!battery->bat) redundantes puderam ser removidos — menos código, menos chances de erro.

Importância prática e status upstream

Esse é um daqueles bugs que poucos vão notar… até que aconteça. Em máquinas suscetíveis — ou em cenários de teste automatizado — ele aparece e confunde. O patch já passou por várias iterações (v6), com feedback do kernel test robot e da comunidade, e foi marcado para stable, ou seja, deve ser “backportado” para séries já lançadas, não apenas para o próximo kernel. Para quem quiser os detalhes técnicos e o histórico das versões, vale conferir o relatório do lkp citado nos Closes do patch (exemplo) e um caso semelhante resolvido anos atrás em sysfs_remove_battery() (referência de 2011 aqui).

Compartilhe este artigo