在Linux内核4.12中,wake_up_interruptible()的正确用法是什么?

时间:2019-11-04 09:36:35

标签: c linux-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..)
}

但是,当我执行时,内核会抱怨

  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...

1 个答案:

答案 0 :(得分:0)

wait_event_interruptible()宏期望当前任务状态为TASK_RUNNING,并且当执行返回给调用者时,任务状态会变回TASK_RUNNING。因此,应删除前一个呼叫set_current_state(TASK_INTERRUPTIBLE);和后一个呼叫__set_current_state(TASK_RUNNING);

在执行wait_event_interruptible()宏期间,所提供的condition将被评估一次或多次,最初处于TASK_RUNNING状态,随后在TASK_INTERRUPTIBLE被唤醒状态。

如果wait_event_interrubtible()之前的信号中断了-ERESTARTSYS宏,则返回condition;如果condition的值为true,则返回0。