ハードウェアIOMMUを使用するときにIOMMUで使用されるバウンスバッファを無効にする方法を学びます。
さらにコンテキストを提供するために、IOMMU_DEFAULT_DMA_STRICTがカーネルに設定されると、ページマッピングが解放されると厳密なIOTLB無効化が有効になります。また、「追加バウンスバッファレイヤ」を使用します。
引用:
config IOMMU_DEFAULT_DMA_STRICT
bool "Translated - Strict"
help
Trusted devices use translation to restrict their access to only
DMA-mapped pages, with strict TLB invalidation on unmap. Equivalent
to passing "iommu.passthrough=0 iommu.strict=1" on the command line.
Untrusted devices always use this mode, with an additional layer of
bounce-buffering such that they cannot gain access to any unrelated
data within a mapped page.
説明によると、この機能は信頼できないPCIデバイスに対して厳密なIOTLB無効化とバウンスバッファを有効にします。現在私が知っているように、この設定オプションはまだハードウェアIOMMUとバウンスバッファを使用しています(間違っている場合は修正してください)。
関連するパフォーマンスオーバーヘッドを確認するために、IOMMUのバウンスバッファのみを有効/無効にする方法が必要です。
つまり、この「追加レイヤー」のオーバーヘッドを探したいと思います。
ハードウェアIOMMUを使用する場合にのみソフトウェアバウンスバッファを有効/無効にする方法があるかどうかを教えてください。
私が今まで試したこと:
iommu = softやswiotlb = {force | no force}などのカーネルコマンドラインオプションがあることを確認しました。
iommu = softは、ハードウェアIOMMUの代わりにソフトウェアバウンスバッファリングを使用しているようです(参照https://www.kernel.org/doc/Documentation/x86/x86_64/boot-options.txt)これは私が望むものではありません。
ハードウェアIOMMUの「追加レイヤー」として使用するときは、バウンスバッファリングを有効/無効にしたいと思います。
swiotlb = forceは、すべてのIO操作がSWバウンスバッファを通過するように強制するため、私が望むようです。ただし、ハードウェア IOMMU が引き続き使用されるかどうかは指定されません。
誰かがこれを確認できればいいでしょう。
この場合、ソフトウェアバウンスバッファなしでハードウェアIOMMUを有効にするには、次のカーネルコマンドラインパラメータを使用します。
intel_iommu=on iommu=force
HW IOMMUを使用してソフトウェアバウンスバッファを有効にするには:
intel_iommu=on iommu=force swiotlb=force
答え1
私はカーネル開発者に同じ質問をしましたが、他の人も同じ問題を抱えている場合は、ここに答えを投稿します(関連カーネルメールスレッド)。
IOMMU SW バウンスバッファを有効または無効にするカーネルブートオプションや設定オプションはありません。ソフトウェアバウンスバッファは、信頼できないPCIデバイスに対して内部的に有効になります。 Linuxカーネルは、外部ポートを持つデバイス/インタフェースを信頼できないものとして扱います(より正確な詳細は、カーネルパッチとカーネルsrc自体にあります。例: -https://patchwork.kernel.org/project/linux-pci/patch/[Eメール保護]/)。