Descarregar o módulo do kernel sem resposta

4

Contexto : às vezes meu laptop não entra no modo de suspensão com o erro

Freezing of tasks failed after 20.008 seconds (0 tasks refusing to freeze, wq_busy=1)

Eu sei que isso é uma indicação de que um workqueue está se comportando mal ( link ) e depois de muito mexer, acabei verificando a saída do magic 't' SysRq, e isso indicava que um workqueue relacionado ao memstick estava aparentemente parado. A saída de cat /proc/WORKER-PID/stack estava sempre presa em uma função chamada memstick_set_rw_addr . IIUC esta função é de um módulo do kernel chamado memstick. Este módulo é requerido por outro módulo chamado rtsx_pci_ms , que eu tentei descarregar. Eu fiz modprobe -r rtsx_pci_ms mas ele não mostrou nada e não retornou (e eu não pude nem mesmo matar o modprobe assim que ele estava rodando, ele simplesmente não reagiu ao killall -KILL modprobe nem ao Control + C). [Eu então tive que me desligar, então não posso testar nada agora, mas a situação acontece uma ou duas vezes por semana, então eu a encontrarei novamente.]

Então agora a questão é como eu forço a matar qualquer coisa que um módulo esteja fazendo se "modprobe -r" estiver travado?

    
por YoungFrog 04.01.2017 / 08:51

1 resposta

2

Você não pode forçar a eliminação do código do kernel se não quiser ser morto. O código do kernel não pode ser eliminado em tempos arbitrários, porque pode estar no meio de acessar um periférico, ele pode conter um bloqueio, ele pode ter alocado alguns recursos que precisam ser liberados ... O código do Userland pode ser eliminado porque o kernel armazena todos esses recursos em nome do processo e os limpa se o processo morrer. Mas dentro do kernel, cada pedaço de código deve manipular sua própria limpeza.

Normalmente, o código do kernel verificará os sinais e encerrará o que está fazendo se receber um sinal. Mas você encontrou um bug do kernel. Nesse caso, você está sem sorte. Se o código está preso, está preso. Como o código travado está sendo executado no contexto da chamada de sistema de um processo, essa chamada de sistema nunca retornará (a menos que a situação dentro do kernel de alguma forma se corrija). O processo está no meio de uma chamada de sistema, então não pode ser morto. O sinal KILL é enfileirado, e se a chamada do sistema for retornada, o processo morreria imediatamente, mas se a chamada do sistema não retornasse, o processo estaria travado.

    
por 05.01.2017 / 01:46