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