Я просматриваю модули ядра драйвера в ядре Linux, и обычно request_irq() вызывается из функции зонда. Одним из таких примеров может быть drivers/net/ethernet/natsemi/ns83820.ko.
request_irq() вызывает request_threaded_irq() и это упоминается в комментариях:
This call allocates interrupt resources and enables the
interrupt line and IRQ handling. From the point this
call is made your handler function may be invoked.
связь:https://elixir.bootlin.com/linux/latest/source/kernel/irq/manage.c#L1984
Это означает, что обработчик может быть вызван даже до завершения проверки.
Но я заметил, что во многих драйверах не уделяется никакого внимания общим переменным или полям dev, которые могут быть прочитаны и изменены одновременно в зонде и обработчике прерываний.
Я хочу знать, как часто возникает ситуация, когда зонд и обработчик прерываний работают параллельно.
решение1
Обработчик прерываний может быть вызван, пока зонд еще не завершил работу. Однако, чтобы это произошло, устройство должно быть инициализировано и сгенерировать прерывание. Довольно часто функция зонда сначала инициализирует устройство и гарантирует, что оно не будет генерировать прерывания, прежде чем запросить irq. Это гарантирует, что обработчик не будет вызван, пока драйвер не будет готов обрабатывать прерывания.
Одним из распространенных исключений являются драйверы RTC, и я недавно исправил некоторые из них. Это происходит потому, что RTC все еще работает, а Linux — нет, и драйвер не должен повторно инициализировать устройство при каждой загрузке. Вот один пример: