All of lore.kernel.org
 help / color / mirror / Atom feed
From: Jason Gunthorpe <jgg@ziepe.ca>
To: Rik van Riel <riel@surriel.com>
Cc: linux-kernel@vger.kernel.org, robin.murphy@arm.com,
	joro@8bytes.org, will@kernel.org, iommu@lists.linux.dev,
	kyle@mcmartin.ca, kernel-team@meta.com,
	Rik van Riel <riel@meta.com>
Subject: Re: [PATCH 5/5] iova: add KUnit test suite
Date: Fri, 15 May 2026 19:43:17 -0300	[thread overview]
Message-ID: <20260515224317.GM7702@ziepe.ca> (raw)
In-Reply-To: <20260513020304.1528751-6-riel@surriel.com>

On Tue, May 12, 2026 at 10:00:22PM -0400, Rik van Riel wrote:
> From: Rik van Riel <riel@meta.com>
> 
> Add a kunit suite for the augmented-rbtree IOVA allocator, plus an
> iova_domain_verify_invariants() helper (compiled only when the test
> config is enabled) that walks the tree and confirms every node's
> gap_to_prev, clamped_gap32, __subtree_max_gap, and __subtree_max_gap32
> match what recomputation from scratch yields.
> 
> Test cases:
>   - test_init_destroy: domain lifecycle, no leaks.
>   - test_basic_alloc_free: single alloc/free roundtrip, top-down reuse.
>   - test_size_aligned: alignment of size_aligned allocs across orders 0..7.
>   - test_top_down_preference: sequential allocs decrease in pfn_lo.
>   - test_limit_pfn_respected: 100 allocs all stay <= limit_pfn.
>   - test_reserve_iova: allocs avoid the reserved range.
>   - test_find_iova: lookup by pfn returns the right iova.
>   - test_32bit_in_64bit_domain: 1000 64-bit allocs followed by a 32-bit
>     alloc must still find a slot below DMA_BIT_MASK(32) -- exercises
>     the __subtree_max_gap32 augmentation.
>   - test_two_phase_alignment: pack size-2 size_aligned allocs, free
>     every other; subsequent size-2 alloc must succeed via the phase-2
>     fallback search since phase-1's S+A-1 threshold prunes the size-2
>     gaps.
>   - test_pci_32bit_workaround_pattern: alternate 32-bit-first allocation
>     attempts with 64-bit fallback, mirroring dma-iommu.c.
>   - test_stress_random: 2048 random alloc/free operations with mixed
>     sizes, alignments, and 32/64-bit limits, with periodic invariant
>     checks.
> 
> Each test verifies the augmented invariants both during and after the
> test run so that any sequencing bug in insert / erase / rotate /
> propagate is caught at the operation that introduced it.
> 
> Tested by: building drivers/iommu/iova.o and drivers/iommu/iova-kunit.o
> (no warnings); runtime execution requires booting a kernel with
> CONFIG_IOMMU_IOVA_KUNIT_TEST=y under qemu-system-x86_64 (not available
> on this devvm).
    ^^^^^^^^^^^^^^^

Heh, you should still read the patches when using claude :)

Can you add a .kunitconfig please? The tests should run with a command like:

    tools/testing/kunit/kunit.py run --build_dir build_kunit_x86_64 --arch x86_64 --kunitconfig ./drivers/iommu/.kunitconfig

Also it is worth while to carefully read each test because claude will
happily write nonsense tests that avoid actual bugs so they succeed...

> +static struct iova_test_ctx *iova_test_init_ctx(struct kunit *test)
> +{
> +	struct iova_test_ctx *ctx;
> +	int ret;
> +
> +	ctx = kunit_kzalloc(test, sizeof(*ctx), GFP_KERNEL);
> +	KUNIT_ASSERT_NOT_NULL(test, ctx);
> +
> +	ret = iova_cache_get();
> +	KUNIT_ASSERT_EQ(test, ret, 0);
> +
> +	init_iova_domain(&ctx->iovad, TEST_GRANULE, 1);
> +	ret = iova_domain_init_rcaches(&ctx->iovad);
> +	KUNIT_ASSERT_EQ(test, ret, 0);
> +	ctx->initialized = true;
> +	KUNIT_ASSERT_TRUE(test, iova_domain_verify_invariants(&ctx->iovad));
> +	return ctx;
> +}
> +
> +static void iova_test_cleanup(struct kunit *test, struct iova_test_ctx *ctx)
> +{
> +	if (ctx->initialized) {
> +		KUNIT_EXPECT_TRUE(test, iova_domain_verify_invariants(&ctx->iovad));
> +		put_iova_domain(&ctx->iovad);
> +		iova_cache_put();
> +		ctx->initialized = false;
> +	}
> +}
> +
> +static void test_init_destroy(struct kunit *test)
> +{
> +	struct iova_test_ctx *ctx = iova_test_init_ctx(test);
> +
> +	iova_test_cleanup(test, ctx);
> +}

This iova_test_init_ctx()/iova_test_cleanup() stuff is not the right
way to use kunit. Add a fixture and remove it from every test.

> +bool iova_domain_verify_invariants(struct iova_domain *iovad)
> +{
> +	bool ok = true;
> +	unsigned long flags;
> +
> +	spin_lock_irqsave(&iovad->iova_rbtree_lock, flags);
> +	iova_walk_verify(iovad->rbroot.rb_node, iovad, &ok);
> +	spin_unlock_irqrestore(&iovad->iova_rbtree_lock, flags);
> +	return ok;
> +}
> +EXPORT_SYMBOL_GPL(iova_domain_verify_invariants);

EXPORT_SYMBOL_IF_KUNIT

>  int iova_domain_init_rcaches(struct iova_domain *iovad);
>  struct iova *find_iova(struct iova_domain *iovad, unsigned long pfn);
>  void put_iova_domain(struct iova_domain *iovad);
> +#if IS_ENABLED(CONFIG_IOMMU_IOVA_KUNIT_TEST)
> +bool iova_domain_verify_invariants(struct iova_domain *iovad);
> +#endif

Don't really need this #ifdef

Jason

      reply	other threads:[~2026-05-15 22:43 UTC|newest]

Thread overview: 7+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2026-05-13  2:00 [PATCH 0/5] iova augmented rbtree O(log n) alloc_iova Rik van Riel
2026-05-13  2:00 ` [PATCH 1/5] iova: switch to augmented rbtree for log(n) allocation Rik van Riel
2026-05-13  2:00 ` [PATCH 2/5] iova: drop dead cached_node / cached32_node infrastructure Rik van Riel
2026-05-13  2:00 ` [PATCH 3/5] iova: limit_pfn-aware augmentation for log(n) 32-bit alloc Rik van Riel
2026-05-13  2:00 ` [PATCH 4/5] iova: alignment-aware two-phase search for log(n) aligned alloc Rik van Riel
2026-05-13  2:00 ` [PATCH 5/5] iova: add KUnit test suite Rik van Riel
2026-05-15 22:43   ` Jason Gunthorpe [this message]

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20260515224317.GM7702@ziepe.ca \
    --to=jgg@ziepe.ca \
    --cc=iommu@lists.linux.dev \
    --cc=joro@8bytes.org \
    --cc=kernel-team@meta.com \
    --cc=kyle@mcmartin.ca \
    --cc=linux-kernel@vger.kernel.org \
    --cc=riel@meta.com \
    --cc=riel@surriel.com \
    --cc=robin.murphy@arm.com \
    --cc=will@kernel.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.