Поток ядра Linux с прерываемым временем ожидания события ожидания

#linux #linux-kernel

Вопрос:

У меня есть irq, который вызывается, если что-то в mcu требует внимания. В irq я делаю следующее.

   set_bit(VUSB_MCU_IRQ_GPIO, (void*)amp;udc->service_request);
  wake_up_interruptible(amp;udc->service_thread_wq);
 

Я хочу, чтобы работа выполнялась в потоке, и поток должен спать, пока что-то не прибудет. Поэтому я делаю:

 while (!kthread_should_stop()) {^

  wait_event_interruptible_timeout(udc->service_thread_wq,
     kthread_should_stop() || udc->service_request, msecs_to_jiffies(500));


  if (kthread_should_stop())
    break;

  if (test_and_clear_bit(VUSB_MCU_IRQ_GPIO, (void*)amp;udc->service_request)) {
    dev_info(udc->dev, "usb hub service is waken up by mcu irq the hubn");
  }}
 

Является ли это правильной функцией события ожидания. В ожидании.h мы также видим другие функции, такие как
«wait_event_interruptible_lock_irq_timeout», и неясно, какие из них следует использовать.

Я протестировал также другой, но, похоже, я не понял его правильно, и появились некоторые ошибки. Если, например, я удалю тайм-аут, появится сообщение о блокировке.

Комментарии:

1. Я не могу найти «wait_event_interruptible_irq_timeout» в wait.h.

2. Я предполагаю, что ^ while (!kthread_should_stop()) {^ это опечатка в строке?

3. Да, в коде вопросов есть опечатка, но код предназначен только для того, чтобы задать вопрос. Я не знаю, как это происходит, но функции ожидания irq имеют параметр блокировки. Я исправил название, но это не меняет вопроса.

Ответ №1:

С помощью следующей функции поток с обработкой irq работает без каких-либо проблем.

 wait_event_interruptible_lock_irq_timeout
 

Комментарии:

1. Из вашего вопроса неясно, почему wait_event_interruptible_lock_irq_timeout это решает проблему, потому что в вопросе вообще не упоминается использование спин-блокировки.

2. Да, я также не знаю, почему это работает, но это так.