LinuxドライバでNVME IOをどこで追跡できますか?

LinuxドライバでNVME IOをどこで追跡できますか?

小さなLinuxドライバ拡張を書きたいです。具体的には、ホストとM.2-nvme-ssd間のすべての通信をユーザー空間ファイルに書きたいと思います。 nvmeドライバはかなり大きく、どこから始めるべきかを把握するのが困難です。

私の同僚がSDカードで同様のことをしました。ホストがカードから応答を受信し、ジョブが終了しようとしたときにIO(function is)を追跡しますsdhci_request_done。トレースは、オペコード、データ、タイムスタンプとともに要求と応答を表示します。これが私の目標になります。

IOを追跡するプログラムが見つかりましたが、ユーザースペースで実行されます。これは、ドライバからカードに直接メッセージを送信できるため、問題になります。

だから私の質問は次のとおりです。タスクを遅らせたり、あまりにも多くのメモリを割り当てずにデータを取得したい場合は、ホストドライバにどこに入る必要がありますか?それともこれを実行できるドライバ機能はありますか?

ベストアンサー1

私の同僚がSDカードで同様のことをしました。ホストがカードからの応答を受け取り、ジョブを終了しようとすると、IOを追跡します(関数はsdhci_request_done)。

SDカードとは異なり、ほとんどのデータは実際にDMAを介してnvmeデバイス(通常は)に交換されるため、Linuxは何が転送されたのかわからず、転送された内容だけがわかります。 DMAを無効にすると、パフォーマンスが大幅に低下する可能性があると確信しています。これを行う方法はわかりませんが、カーネルブートフラグを使用してこれを実行できます。

それ以外に、何も拡張せずに、すでに交換されているすべてのコマンドを追跡できます。 Linuxにはトレースポイントがあり、nvmeはそのうちの1つです。

sudo perf trace -e nvme:nvme_\* > logfile

おすすめ記事