iommu: Improve map/unmap sanity checks
authorRobin Murphy <robin.murphy@arm.com>
Tue, 12 Sep 2023 16:18:44 +0000 (17:18 +0100)
committerJoerg Roedel <jroedel@suse.de>
Mon, 25 Sep 2023 10:04:38 +0000 (12:04 +0200)
The current checks for the __IOMMU_DOMAIN_PAGING capability seem a
bit stifled, since it is quite likely now that a non-paging domain
won't have a pgsize_bitmap and/or mapping ops, and thus get caught
by the earlier condition anyway. Swap them around to test the more
fundamental condition first, then we can reasonably also upgrade
the other to a WARN_ON, since if a driver does ever expose a paging
domain without the means to actually page, it's clearly very broken.

Signed-off-by: Robin Murphy <robin.murphy@arm.com>
Link: https://lore.kernel.org/r/524db1ec0139c964d26928a6a264945aa66d010c.1694525662.git.robin.murphy@arm.com
Signed-off-by: Joerg Roedel <jroedel@suse.de>
drivers/iommu/iommu.c

index 865fa4f179a8ff5293823578c38714b82ede94d5..b2d08e422942ba55751d6d052b209c4924a03c18 100644 (file)
@@ -2519,12 +2519,12 @@ static int __iommu_map(struct iommu_domain *domain, unsigned long iova,
        phys_addr_t orig_paddr = paddr;
        int ret = 0;
 
-       if (unlikely(!ops->map_pages || domain->pgsize_bitmap == 0UL))
-               return -ENODEV;
-
        if (unlikely(!(domain->type & __IOMMU_DOMAIN_PAGING)))
                return -EINVAL;
 
+       if (WARN_ON(!ops->map_pages || domain->pgsize_bitmap == 0UL))
+               return -ENODEV;
+
        /* find out the minimum page size supported */
        min_pagesz = 1 << __ffs(domain->pgsize_bitmap);
 
@@ -2602,10 +2602,10 @@ static size_t __iommu_unmap(struct iommu_domain *domain,
        unsigned long orig_iova = iova;
        unsigned int min_pagesz;
 
-       if (unlikely(!ops->unmap_pages || domain->pgsize_bitmap == 0UL))
+       if (unlikely(!(domain->type & __IOMMU_DOMAIN_PAGING)))
                return 0;
 
-       if (unlikely(!(domain->type & __IOMMU_DOMAIN_PAGING)))
+       if (WARN_ON(!ops->unmap_pages || domain->pgsize_bitmap == 0UL))
                return 0;
 
        /* find out the minimum page size supported */