하드웨어 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/[이메일 보호됨]/).