応答しないカーネルモジュールの削除

応答しないカーネルモジュールの削除

コンテキスト:時々ノートパソコンがスリープモードに入らず、エラーが発生することがあります。

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

私はこれが間違った作業キューです(https://askubuntu.com/questions/692700/what-does-wq-busy-1-indicate-in-a-failure-to-suspension) 多くの悩みの終わりに、最終的にマジック't' SysRqの出力を確認しました。の出力はcat /proc/WORKER-PID/stack常にという関数に閉じ込められていますmemstick_set_rw_addr。 IIUC この関数は、memstick というカーネルモジュールで提供されます。このモジュールは別のモジュールに必要であり、それらrtsx_pci_msを削除しようとします。私はこれをしましたが、modprobe -r rtsx_pci_ms何も表示されず返されません(そして実行されたらmodprobeを殺すことはできず、killall -KILL modprobeCtrl + Cにまったく応答しません)。 [その時、電源を切らなければ今は何もテストできませんが、週に1、2回ほどこういうことが起きて再度取り上げます。 ]

だから今質問"modprobe -r"が停止したときにモジュールが実行している操作を強制的に終了するにはどうすればよいですか?

答え1

カーネルコードを終了したくない場合は強制終了できません。カーネルコードは、ペリフェラルにアクセス中であるか、ロックを保持または解放する必要があるいくつかのリソースを割り当てた可能性があるため、いつでも終了できません。カーネルが保持しているため、ユーザーモードコードが終了する可能性があります。これらのリソースはすべてプロセスを表し、プロセスが終了したらクリーンアップします。ただし、カーネル内では、各コードスニペットが独自のクリーンアップを処理する必要があります。

通常、カーネルコードはシグナルを確認し、シグナルが受信されると実行中のジョブを完全に終了します。ところで、カーネルエラーが発生しました。この場合は幸運ではありません。コードがついているとついているのです。中断されたコードはプロセスのシステムコールコンテキスト内で実行されるため、そのシステムコールは決して返されません(カーネル内部の状況が何らかの形で変更されない限り)。プロセスがシステム呼び出し中なので終了できません。 KILL シグナルがキューに入り、システムコールが返されるとプロセスはすぐに終了しますが、システムコールが返されない場合はプロセスは中断されます。

関連情報