[PATCH v7 15/15] iommupt: Add a kunit test for the IOMMU implementation
Jason Gunthorpe
jgg at nvidia.com
Wed Oct 29 09:00:46 PDT 2025
On Thu, Oct 23, 2025 at 03:20:45PM -0300, Jason Gunthorpe wrote:
> +static void test_map_table_to_oa(struct kunit *test)
> +{
> + struct kunit_iommu_priv *priv = test->priv;
> + pt_vaddr_t limited_pgbitmap =
> + priv->info.pgsize_bitmap % (IS_32BIT ? SZ_2G : SZ_16G);
> + struct pt_range range = pt_top_range(priv->common);
> + unsigned int pgsz_lg2;
> + pt_vaddr_t max_pgsize;
> + pt_vaddr_t cur_va;
> +
> + max_pgsize = 1ULL << (vafls(limited_pgbitmap) - 1);
> + KUNIT_ASSERT_TRUE(test, priv->info.pgsize_bitmap & max_pgsize);
> +
> + for (pgsz_lg2 = 0; pgsz_lg2 != PT_VADDR_MAX_LG2; pgsz_lg2++) {
> + pt_oaddr_t paddr = log2_set_mod(priv->test_oa, 0, pgsz_lg2);
> + u64 len = log2_to_int(pgsz_lg2);
> + pt_vaddr_t offset;
> +
> + if (!(priv->info.pgsize_bitmap & len))
> + continue;
> + if (len > max_pgsize)
> + break;
> +
> + cur_va = ALIGN(range.va + priv->smallest_pgsz * 256,
> + max_pgsize);
> + for (offset = 0; offset != max_pgsize; offset += len)
> + do_map(test, cur_va + offset, paddr + offset, len);
> + check_iova(test, cur_va, paddr, max_pgsize);
> + KUNIT_ASSERT_EQ(test, count_valids_single(test, len),
> + max_pgsize / len);
It seems alot of compilers figured out how to make that divide into a
shift, but at least one hits a __udivdi3. Should be:
KUNIT_ASSERT_EQ(test, count_valids_single(test, len),
log2_div(max_pgsize, pgsz_lg2));
Jason
More information about the linux-riscv
mailing list