簡體   English   中英

linux kernel 4.12中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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM