C linux内核4.12中wake\u up\u interruptable()的正确用法是什么?

C linux内核4.12中wake\u up\u interruptable()的正确用法是什么?,c,linux-kernel,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 P

我有两个函数,内核线程阻塞

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

wait\u event\u interruptable()
宏预期当前任务状态为
task\u RUNNING
,当执行返回调用方时,任务状态变回
task\u RUNNING
。因此,前面的调用
设置当前状态(任务可中断)
和后续调用
\u设置\u当前\u状态(任务\u运行)

在执行
wait\u event\u interruptible()
宏期间,提供的
条件将被评估一次或多次,最初处于
TASK\u RUNNING
状态,随后在
TASK\u interruptible
状态下唤醒


如果在
条件
之前被信号中断,则
wait_event_interruible()
宏返回
-ERESTARTSYS
,或者当
条件
计算为真时返回0