]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
iommu/io-pgtable-arm: Add self test for the last page in the IAS
authorMostafa Saleh <smostafa@google.com>
Thu, 24 Oct 2024 16:25:16 +0000 (16:25 +0000)
committerWill Deacon <will@kernel.org>
Tue, 29 Oct 2024 15:28:06 +0000 (15:28 +0000)
Add a case in the selftests that can detect some bugs with concatenated
page tables, where it maps the biggest supported page size at the end of
the IAS, this test would fail without the previous fix.

Signed-off-by: Mostafa Saleh <smostafa@google.com>
Link: https://lore.kernel.org/r/20241024162516.2005652-3-smostafa@google.com
Signed-off-by: Will Deacon <will@kernel.org>
drivers/iommu/io-pgtable-arm.c

index a286c5404ea7011855630d5828e7093746c02b75..40c1cd079f8e1286defcf2ea8557292e6c956652 100644 (file)
@@ -1394,6 +1394,23 @@ static int __init arm_lpae_run_tests(struct io_pgtable_cfg *cfg)
                        iova += SZ_1G;
                }
 
+               /*
+                * Map/unmap the last largest supported page of the IAS, this can
+                * trigger corner cases in the concatednated page tables.
+                */
+               mapped = 0;
+               size = 1UL << __fls(cfg->pgsize_bitmap);
+               iova = (1UL << cfg->ias) - size;
+               if (ops->map_pages(ops, iova, iova, size, 1,
+                                  IOMMU_READ | IOMMU_WRITE |
+                                  IOMMU_NOEXEC | IOMMU_CACHE,
+                                  GFP_KERNEL, &mapped))
+                       return __FAIL(ops, i);
+               if (mapped != size)
+                       return __FAIL(ops, i);
+               if (ops->unmap_pages(ops, iova, size, 1, NULL) != size)
+                       return __FAIL(ops, i);
+
                free_io_pgtable_ops(ops);
        }