• Will Deacon's avatar
    iommu/io-pgtable-arm: Fix iova_to_phys for block entries · 7c6d90e2
    Will Deacon authored
    The implementation of iova_to_phys for the long-descriptor ARM
    io-pgtable code always masks with the granule size when inserting the
    low virtual address bits into the physical address determined from the
    page tables. In cases where the leaf entry is found before the final
    level of table (i.e. due to a block mapping), this results in rounding
    down to the bottom page of the block mapping. Consequently, the physical
    address range batching in the vfio_unmap_unpin is defeated and we end
    up taking the long way home.
    
    This patch fixes the problem by masking the virtual address with the
    appropriate mask for the level at which the leaf descriptor is located.
    The short-descriptor code already gets this right, so no change is
    needed there.
    
    Cc: <stable@vger.kernel.org>
    Reported-by: default avatarRobin Murphy <robin.murphy@arm.com>
    Tested-by: default avatarRobin Murphy <robin.murphy@arm.com>
    Signed-off-by: default avatarWill Deacon <will.deacon@arm.com>
    7c6d90e2
io-pgtable-arm.c 28 KB