2014-09-26 104 views
2

基本上我使用kthread_create()創建了一個內核線程。 kthread反覆做某事。就像`kill -9`一樣,內核中有沒有殺死內核kthread的方法?

while() { 
    //do something 
    msleep_interruptible(1000); 
} 

同時,我想達到一定條件時殺死這KTHREAD(例如一個特定的系統調用被調用,或者一個特定的用戶空間進程被終止)。我已通讀kthread.c,但只發現kthread_stop(),這不像kill -9。它所做的只是設置KTHREAD_SHOULD_STOPkthread->flag,並且在k線程函數體內必須調用kthread_should_stop()來查詢該位並自行調用do_exit()

我已經嘗試了下面的這種方法。問題是當調用kthread_stop()時,k線程通常處於睡眠狀態(即msleep_interruptible(1000))。因此,我總是觀察到呼叫kthread_stop()和k線實際退出之間的延遲。這導致了我的項目無法忍受的延遲。我想要的就像kill -9,也就是說,在我致電kthread_stop()之後,k線程將立即終止。和想法,以實現這一目標?

while(!kthread_should_stop()) { 
    //do something 
    msleep_interruptible(1000); 
} 
+0

您應該將您的解決方案作爲答案發布,而不是將其包含在問題中。 (這是完全可以接受的,甚至鼓勵,發佈,甚至接受自己的問題的答案。) – 2014-09-26 17:40:45

+1

@KeithThompson謝謝你的建議。我已經從問題中刪除了我的解決方案,並將其作爲答案發布。 – w00dbunny 2014-09-26 21:07:22

回答

0

我找到了解決我的問題的辦法。這不是因爲睡眠(即msleep_interruptible(1000))。實際上這個功能確實允許中斷,並且在設置KTHREAD_SHOULD_STOP之後,kthread_stop()也執行wake_up_process()來喚醒目標k線。所以理想情況下不應該有任何問題,這意味着無論msleep_interruptible()的參數如何,只要調用kthread_stop(),k線程就會被喚醒並很快終止。

但是,有一個「失去喚醒」的競爭條件(我受到this post的啓發,這與我的非常類似的問題)。棘手的是,msleep_interruptible()實質上包含兩種方法,set_current_state(TASK_INTERRUPTIBLE);schedule_timeout();,並且kthread_stop()可以在兩種方法之前執行。所以訂單會這樣:

[kthread]: //do something 
[my syscall]: wake_up_process(kthread); //inside kthread_stop() 
[kthread]: set_current_state(TASK_INTERRUPTIBLE); 
[kthread]: schedule_timeout(); 

因此,wake_up_process()將簡單地被kthread忽略。要解決此問題,必須解耦set_current_state(TASK_INTERRUPTIBLE);schedule_timeout();。以下代碼到目前爲止工作正常。

while(!kthread_should_stop()) { 
    //do something 
    set_current_state(TASK_INTERRUPTIBLE); 
    if (kthread_should_stop()) { 
     break; 
    } 
    schedule_timeout(); 
} 

在這個意義上說,不存在退出內核中一路殺一個KTHREAD就像kill -9