私は通常、プローブ関数でrequest_irq()を呼び出してLinuxカーネルのドライバカーネルモジュールを調べています。 drivers/net/ethernet/natsemi/ns83820.koがそのような例の1つです。
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
これは、プローブが完了する前にハンドラを呼び出すことができることを意味します。
しかし、私は多くのドライバがプローブと割り込みハンドラで同時に読み取って変更できる共有変数や攻撃フィールドに興味がないことに気づきました。
プローブと割り込みハンドラが並列に実行される場合がどれだけ頻繁に発生するかを知りたいです。
答え1
プローブが完了していない場合は、割り込みハンドラを呼び出すことができます。ただし、これを達成するには、デバイスを初期化して割り込みを生成する必要があります。通常、プローブ機能は最初にデバイスを初期化し、irqを要求する前に割り込みを生成しないことを確認します。これにより、ドライバが割り込みを処理する準備ができるまでハンドラは呼び出されません。
一般的な例外はRTCドライバですが、その一部は最近修正されました。これはRTCはまだ実行中ですが、Linuxは実行されず、ドライバが起動するたびにデバイスを再初期化しないでください。例は次のとおりです。