我有两个功能,内核线程
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...
答案 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。