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