解除安裝無響應的核心模組
上下文:有時我的筆記型電腦不會因錯誤而進入睡眠模式
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-suspend)並且經過多次擺弄,我最終檢查了magic ’t’ SysRq 的輸出,這表明與memstick 相關的工作隊列顯然已停止。的輸出
cat /proc/WORKER-PID/stack
總是卡在一個名為memstick_set_rw_addr
. IIUC 這個函式來自一個叫做 memstick 的核心模組。另一個名為 的模組需要此模組rtsx_pci_ms
,然後我嘗試將其解除安裝。我做了modprobe -r rtsx_pci_ms
,但它什麼也沒顯示,也不會返回(而且我什至無法在 modprobe 執行後殺死它,它根本沒有對 Control+C 做出反應,killall -KILL modprobe
也沒有對 Control+C 做出反應)。$$ I then had to poweroff so I can’t test anything right now but the situation happens about once or twice a week so I will encounter it again. $$ 所以現在的問題是,如果“modprobe -r”被卡住,我如何強制殺死模組正在做的事情?
如果不想被殺死,則不能強制殺死核心程式碼。核心程式碼不能在任意時間被殺死,因為它可能正在訪問外圍設備,它可能持有一個鎖,它可能分配了一些需要釋放的資源……使用者態程式碼可以被殺死,因為核心擁有所有這些資源代表程序並在程序終止時清理它們。但在核心內部,每段程式碼都必須處理自己的清理工作。
通常,核心程式碼會檢查信號並在收到信號時干淨地退出它正在做的事情。但是您遇到了核心錯誤。在這種情況下,你不走運。如果程式碼卡住了,那就卡住了。由於卡住的程式碼是在程序的系統呼叫的上下文中執行的,因此該系統呼叫將永遠不會返回(除非核心內部的情況以某種方式自行糾正)。該程序處於系統呼叫的中間,因此無法被殺死。KILL 信號排隊,如果系統呼叫返回,則程序將立即死亡,但如果系統呼叫沒有返回,則程序卡住。