Как правильно использовать wake_up_interruptible () в ядре Linux 4.12? - PullRequest
0 голосов
/ 04 ноября 2019

У меня есть две функции, поток ядра, который блокирует на

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 голосов
/ 04 ноября 2019

Макрос wait_event_interruptible() ожидает, что текущее состояние задачи равно TASK_RUNNING, и состояние задачи изменяется на TASK_RUNNING, когда выполнение возвращается к вызывающей стороне. Поэтому предыдущий вызов set_current_state(TASK_INTERRUPTIBLE); и последующий вызов __set_current_state(TASK_RUNNING); должны быть удалены.

Во время выполнения макроса wait_event_interruptible() переданный condition будет оцениваться один или несколько раз, первоначально в *Состояние 1010 *, а затем при пробуждении в состоянии TASK_INTERRUPTIBLE.

Макрос wait_event_interrubtible() возвращает -ERESTARTSYS, если прерван сигналом до condition, или возвращает 0 при conditionоценивается как истина.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...