Re: [PATCH] iommu/vt-d: Atomic breakdown of IOPT into finer granularity

From: Baolu Lu
Date: Mon Aug 14 2023 - 22:07:07 EST


[Please allow me to include Kevin and Alex in this thread.]

On 2023/8/14 20:10, Jie Ji wrote:
With the addition of IOMMU support for IO page fault, it's now possible
to unpin the memory which DMA remapping. However, the lack of support
for unmapping a subrange of the I/O page table (IOPT) in IOMMU can lead
to some issues.

Is this the right contract about how iommu_map/unmap() should be used?
If I remember it correctly, IOVA ranges should be mapped in pairs. That
means, if a range is mapped by iommu_map(), the same range should be
unmapped with iommu_unmap().

Any misunderstanding or anything changed?


For instance, a virtual machine can establish IOPT of 2M/1G for better
performance, while the host system enable swap and attempts to swap out
some 4K pages. Unfortunately, unmap subrange of the large-page mapping
will make IOMMU page walk to error level, and finally cause kernel crash.

Sorry that I can't fully understand this use case. Are you talking about
the nested translation where user spaces manage their own IO page
tables? But how can those pages been swapped out?

This patch support splitting the page table to a finer granularity and
atomic switch to it when unmap subrange of the large-page mapping. It
is much better than the unmap then map method to change IOPT, because
during interval time, all unmapped address space could trigger IO page
fault, which is unacceptable.

Signed-off-by: Jie Ji<jijie.ji@xxxxxxxxxxxxxxxxx>
Reviewed-by: Kaijie Guo<kaijieguo@xxxxxxxxxxxxxxxxx>
---
drivers/iommu/intel/iommu.c | 97 +++++++++++++++++++++++++++++--------
drivers/iommu/intel/iommu.h | 1 +
2 files changed, 78 insertions(+), 20 deletions(-)

Best regards,
baolu