O_DIRECTアクセスmmap-ed dmam_alloc_coherent()の問題

O_DIRECTアクセスmmap-ed dmam_alloc_coherent()の問題

私はこの障害を克服するためのアイデアを探しています。 Xilinx Zynq MPSOCデバイスのPL側から高速データを取得するLinuxカーネルモジュールがあります。カーネルモジュールはdma-proxyの例です(https://xilinx-wiki.atlassian.net/wiki/spaces/A/pages/1027702787/Linux+DMA+From+User+Space+2.0)しかし、バッファを1つだけ使用するように少し修正しました。私たちのDMA実装は、シングルチャネル、Rxのみ、非分散収集IP実装を使用しています。ドライバのdmam_alloc_coherentメモリ空間にデータを移動しています。ただし、サンプルドライバと同じスペースにマッピングすると、O_DIRECTオプションで開かれたユーザースペースファイルにこのデータを書き込むことはできません。これを試みると、write()呼び出しでエラーが発生し、「無効なアドレス」というメッセージが表示されます。ただし、O_DIRECTオプションを使用せずにファイルに直接書き込むことはできます。ただし、このデータレートはPLからの着信データと比較して低すぎます。次に試したのは、dmam_alloc_coherent() メモリ領域からユーザ空間 posix_memalign(512) 割り当て領域への 2 番目のコピーを作成し、そのデータを O_DIRECT 開いたファイルに順番に書き込むことでした。これにより約5倍程度の性能が大幅に向上しました。しかし、まだ予想ほど速くはありません。

私のコードのシナリオのパフォーマンスの概要... (kernel)dmam_alloc_coherent() -> (userspace)file(O_DIRECT) = "無効なアドレス" )dmam_alloc_coherent() -> (ユーザースペース) posix_memalign(512) -> (ユーザースペース)ファイル (O_DIRECT) = 1323MB/秒 (ユーザースペース) posix_memalign(512) -> (ユーザースペース)ファイル (O_DIRECT) = 22秒(実際のPLデータなし、単にmemcontentsをディスクにダンプする)

私はposix_memalign領域の2番目のコピーを実行せずに動作させる方法を見つけることができれば、2000MB /秒に近づくと思います。私の実際の目標速度は1600MB /秒です。 2番目のコピーなしでこれを行う方法を知っている人はいますか?中間コピーなしでO_DIRECTファイルを読み書きできるようにdmaメモリをどのように設定しますか?はは、これをゼロコピーというようですが…。

助けてくださった皆様、よろしくお願いします。しばらく壁に頭を置いていました...

乾杯!

PS。その他の情報...

MPSOC設定:ext4 LVMストライピング設定で構成された2つのNVMEドライブを備えたMPSOCボードのPetalinux。

ディスクのその他のddテスト:

1.dd if=/dev/zero of=tt/test.bin bs=20M count=50 50+0個のレコードのうち50+0個コピーされた

2.dd if=/dev/zero of=tt/test.bin bs=20M count=50 oflag=direct 50+0個のレコードのうち50+0個コピーされたGB/秘書

3.dd if=/dev/zero of=tt/test.bin bs=30M count=1000 oflag=direct 1000+0個のレコードのうち1000+0個のレコードがコピーされましたGB/秒

ベストアンサー1

おすすめ記事