PCI デバイスで発生したユーザー空間でエラーをログに記録するコードを書いています (カーネルは既にカーネル リング バッファーにログを記録しています)。現在、目の前に2つのアプローチがあり、
(eventfd を使用して) ユーザー空間プロセスに割り込みを送信するようにカーネル デバイス ドライバーを変更し、(select() または poll() を使用して) この割り込みを受信すると、ioctl を使用して詳細なエラー情報を取得できます (デバイス ドライバーの変更が必要になります)。 )。これには、避けたいカーネルコードの変更が必要です。
私のプロセスはルートとして実行されるため、sysfs を使用してデバイスのエラー ステータス レジスタを読み書きできます。このためには、常にレジスタをポーリングする必要があり、エラーが発生したら、ステータス レジスタを読み取ってデコードし、詳細なエラー情報を取得して、レジスタをクリアします。
ユーザー空間でのみ変更が必要なため、2 番目のアプローチに傾倒しています。
私の質問は次のとおりです。
- 2番目のアプローチは理にかなっていますか?
- もしそうなら、両方のアプローチの長所と短所は何ですか?
- 2 番目の方法でポーリングを行うと、CPU サイクルが浪費されます。最初のアプローチで select() または poll() を使用すると、同様の割合で CPU サイクルが浪費されますか。
役立つ回答をいただければ幸いです。:)