[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