]> www.infradead.org Git - users/hch/configfs.git/commitdiff
iommu: Do not return 0 from map_pages if it doesn't do anything
authorJason Gunthorpe <jgg@nvidia.com>
Thu, 22 Aug 2024 14:45:55 +0000 (11:45 -0300)
committerJoerg Roedel <jroedel@suse.de>
Mon, 26 Aug 2024 07:16:13 +0000 (09:16 +0200)
These three implementations of map_pages() all succeed if a mapping is
requested with no read or write. Since they return back to __iommu_map()
leaving the mapped output as 0 it triggers an infinite loop. Therefore
nothing is using no-access protection bits.

Further, VFIO and iommufd rely on iommu_iova_to_phys() to get back PFNs
stored by map, if iommu_map() succeeds but iommu_iova_to_phys() fails that
will create serious bugs.

Thus remove this never used "nothing to do" concept and just fail map
immediately.

Fixes: e5fc9753b1a8 ("iommu/io-pgtable: Add ARMv7 short descriptor support")
Fixes: e1d3c0fd701d ("iommu: add ARM LPAE page table allocator")
Fixes: 745ef1092bcf ("iommu/io-pgtable: Move Apple DART support to its own file")
Signed-off-by: Jason Gunthorpe <jgg@nvidia.com>
Acked-by: Will Deacon <will@kernel.org>
Reviewed-by: Kevin Tian <kevin.tian@intel.com>
Link: https://lore.kernel.org/r/2-v1-1211e1294c27+4b1-iommu_no_prot_jgg@nvidia.com
Signed-off-by: Joerg Roedel <jroedel@suse.de>
drivers/iommu/io-pgtable-arm-v7s.c
drivers/iommu/io-pgtable-arm.c
drivers/iommu/io-pgtable-dart.c

index 75f244a3e12df6fe9a4b7eda88671a82b2369480..06ffc683b28feeb478e3a26a80a17e60c806932a 100644 (file)
@@ -552,9 +552,8 @@ static int arm_v7s_map_pages(struct io_pgtable_ops *ops, unsigned long iova,
                    paddr >= (1ULL << data->iop.cfg.oas)))
                return -ERANGE;
 
-       /* If no access, then nothing to do */
        if (!(prot & (IOMMU_READ | IOMMU_WRITE)))
-               return 0;
+               return -EINVAL;
 
        while (pgcount--) {
                ret = __arm_v7s_map(data, iova, paddr, pgsize, prot, 1, data->pgd,
index f5d9fd1f45bf49cdc3db065836f2c7591946ab6b..ff4149ae1751d4e3a79d855e80bbf187476c975d 100644 (file)
@@ -515,9 +515,8 @@ static int arm_lpae_map_pages(struct io_pgtable_ops *ops, unsigned long iova,
        if (WARN_ON(iaext || paddr >> cfg->oas))
                return -ERANGE;
 
-       /* If no access, then nothing to do */
        if (!(iommu_prot & (IOMMU_READ | IOMMU_WRITE)))
-               return 0;
+               return -EINVAL;
 
        prot = arm_lpae_prot_to_pte(data, iommu_prot);
        ret = __arm_lpae_map(data, iova, paddr, pgsize, pgcount, prot, lvl,
index ad28031e1e93d6f542842d072f14d8aa1320881b..c004640640ee50d01dd54c38e89162c0fcb1988f 100644 (file)
@@ -245,9 +245,8 @@ static int dart_map_pages(struct io_pgtable_ops *ops, unsigned long iova,
        if (WARN_ON(paddr >> cfg->oas))
                return -ERANGE;
 
-       /* If no access, then nothing to do */
        if (!(iommu_prot & (IOMMU_READ | IOMMU_WRITE)))
-               return 0;
+               return -EINVAL;
 
        tbl = dart_get_table(data, iova);