• Joao Martins's avatar
    iommufd/iova_bitmap: Handle recording beyond the mapped pages · 2780025e
    Joao Martins authored
    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.comReported-by: default avatarAvihai Horon <avihaih@nvidia.com>
    Fixes: f35f22cc ("iommu/vt-d: Access/Dirty bit support for SS domains")
    Fixes: 421a511a ("iommu/amd: Access/Dirty bit support in IOPTEs")
    Signed-off-by: default avatarJoao Martins <joao.m.martins@oracle.com>
    Tested-by: default avatarAvihai Horon <avihaih@nvidia.com>
    Signed-off-by: default avatarJason Gunthorpe <jgg@nvidia.com>
    2780025e
iova_bitmap.c 13.7 KB