![プローブが完了する前にドライバーの割り込みハンドラーが呼び出される可能性はありますか?](https://rvso.com/image/170630/%E3%83%97%E3%83%AD%E3%83%BC%E3%83%96%E3%81%8C%E5%AE%8C%E4%BA%86%E3%81%99%E3%82%8B%E5%89%8D%E3%81%AB%E3%83%89%E3%83%A9%E3%82%A4%E3%83%90%E3%83%BC%E3%81%AE%E5%89%B2%E3%82%8A%E8%BE%BC%E3%81%BF%E3%83%8F%E3%83%B3%E3%83%89%E3%83%A9%E3%83%BC%E3%81%8C%E5%91%BC%E3%81%B3%E5%87%BA%E3%81%95%E3%82%8C%E3%82%8B%E5%8F%AF%E8%83%BD%E6%80%A7%E3%81%AF%E3%81%82%E3%82%8A%E3%81%BE%E3%81%99%E3%81%8B%3F.png)
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 を要求する前にデバイスが割り込みを生成しないことを確認します。これにより、ドライバーが割り込みを処理する準備ができるまでハンドラが呼び出されなくなります。
よくある例外の 1 つは RTC ドライバーで、最近そのいくつかを修正しました。これは、Linux が動作していないのに RTC が動作しているために発生し、ドライバーは起動するたびにデバイスを再初期化してはならないためです。次に例を示します。