aboutsummaryrefslogtreecommitdiff
path: root/tools/testing
diff options
context:
space:
mode:
authorGravatar Joao Martins <joao.m.martins@oracle.com> 2024-02-02 13:34:10 +0000
committerGravatar Jason Gunthorpe <jgg@nvidia.com> 2024-02-06 11:31:45 -0400
commit2780025e01e2e1c92f83ee7da91d9727c2e58a3e (patch)
treef87ad7f220288d6bb2d862eed77c2b61cbe7e088 /tools/testing
parentiommufd/selftest: Test u64 unaligned bitmaps (diff)
downloadlinux-2780025e01e2e1c92f83ee7da91d9727c2e58a3e.tar.gz
linux-2780025e01e2e1c92f83ee7da91d9727c2e58a3e.tar.bz2
linux-2780025e01e2e1c92f83ee7da91d9727c2e58a3e.zip
iommufd/iova_bitmap: Handle recording beyond the mapped pages
IOVA bitmap is a zero-copy scheme of recording dirty bits that iterate the different bitmap user pages at chunks of a maximum of PAGE_SIZE/sizeof(struct page*) pages. When the iterations are split up into 64G, the end of the range may be broken up in a way that's aligned with a non base page PTE size. This leads to only part of the huge page being recorded in the bitmap. Note that in pratice this is only a problem for IOMMU dirty tracking i.e. when the backing PTEs are in IOMMU hugepages and the bitmap is in base page granularity. So far this not something that affects VF dirty trackers (which reports and records at the same granularity). To fix that, if there is a remainder of bits left to set in which the current IOVA bitmap doesn't cover, make a copy of the bitmap structure and iterate-and-set the rest of the bits remaining. Finally, when advancing the iterator, skip all the bits that were set ahead. Link: https://lore.kernel.org/r/20240202133415.23819-5-joao.m.martins@oracle.com Reported-by: Avihai Horon <avihaih@nvidia.com> Fixes: f35f22cc760e ("iommu/vt-d: Access/Dirty bit support for SS domains") Fixes: 421a511a293f ("iommu/amd: Access/Dirty bit support in IOPTEs") Signed-off-by: Joao Martins <joao.m.martins@oracle.com> Tested-by: Avihai Horon <avihaih@nvidia.com> Signed-off-by: Jason Gunthorpe <jgg@nvidia.com>
Diffstat (limited to 'tools/testing')
0 files changed, 0 insertions, 0 deletions