2017-09-26 102 views
0

我使用下面的API來殺死一個tasklet:殺死一個tasklet同時holdiing spin_lock_irqsave

tasklet_kill(); 

雖然殺微進程,我一直在使用spin_lock_irqsave禁用本地中斷。爲什麼內核引發以下消息(警告):

Attempt to kill taskletlet from interrupt 

這難道不是最好使用tasklet_kill()一邊拿着用spin_lock?

+0

我不知道郵件的實際原因(它實際上是[notice](http://elixir.free-electrons.com/linux/v4.13.3/source/kernel/softirq.c#L585) ,不是一個警告)。但是,如果tasklet運行(在其他CPU上),該函數的目的是**等待**直到完成。鑑於等待實際上是一個*忙等待*,這是允許中斷禁用。但是你確定你想**一個任務,你已經特別移動到tasklet中,並且中斷被禁用了嗎? – Tsyvarev

+0

是的,我想要任何掛起的小程序(已安排)完成。我也希望沒有新的tasklets能夠調度,因此需要禁用中斷以確保沒有新的tasklet從中斷處理程序中調度。 –

回答

0

如果你看看func本身,你會發現它有一個調用yield,它可以放棄cpu。但禁止中斷和/或保持旋轉鎖定。

+0

確定調用'yield()'**是禁止**禁止中斷嗎?當這個函數在內部調用'schedule()'時,它通過'set_current_state(TASK_RUNNING);'來實現,即**,而不改變線程的狀態**。據我瞭解,使用禁用中斷'yield'永遠不會放棄cpu,這是完全沒有作用的。 – Tsyvarev

+0

它調用sys_sched_yield,就好像它是用戶空間那樣 –

+0

我已經注意到了系統調用。但是,我知道沒有一個通用規則,系統調用不能在中斷被禁用的情況下被調用。 (但是,Linux內核的直接系統調用往往被避免)。 – Tsyvarev