![](/img/trans.png)
[英]Why use wake_up_all() and not wake_up_interruptible()?
[英]What is the correct usage of wake_up_interruptible() in linux kernel 4.12?
我有兩個功能,kernel 線程阻塞
Work Kernel Thread()
{
set_current_state(TASK_INTERRUPTIBLE);
wait_event_interruptible(..work.queue, condition)
__set_current_state(TASK_RUNNING);
}
ISR
{
wake_up_interruptible(..work queue..)
}
但是,當我執行時, kernel 抱怨說
WARNING: CPU: 0 PID: 565 at /usr/src/kernel/kernel/sched/core.c:6234 __might_sleep+0x78/0x9c
do not call blocking ops when !TASK_RUNNING; state=1 set at 0x...
wait_event_interruptible()
宏期望當前任務 state 為TASK_RUNNING
,並且當執行返回調用者時,任務 state 將更改回TASK_RUNNING
。 因此,前面的調用set_current_state(TASK_INTERRUPTIBLE);
以及隨后的調用__set_current_state(TASK_RUNNING);
應該被刪除。
在執行wait_event_interruptible()
宏期間,將評估提供的condition
一次或多次,最初在TASK_RUNNING
state 中,隨后在TASK_INTERRUPTIBLE
state 中喚醒時。
如果在condition
之前被信號中斷, wait_event_interrubtible()
宏返回-ERESTARTSYS
,或者當condition
計算為真時返回 0。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.