Возможно ли, что обработчик прерываний драйвера вызывается до завершения проверки?

Возможно ли, что обработчик прерываний драйвера вызывается до завершения проверки?

Я просматриваю модули ядра драйвера в ядре 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 — нет, и драйвер не должен повторно инициализировать устройство при каждой загрузке. Вот один пример:

https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?id=10d0c768cc6d581523d673b9d1b54213f8a5eb24

Связанный контент