如何在 IOMMU 中禁用/启用反弹缓冲区?

如何在 IOMMU 中禁用/启用反弹缓冲区?

我试图弄清楚如何在使用硬件 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 |没有力量}。

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/[电子邮件受保护]/)。

相关内容