From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from mail-qt1-f172.google.com (mail-qt1-f172.google.com [209.85.160.172]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 56C5F3909B7 for ; Fri, 15 May 2026 22:43:19 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.160.172 ARC-Seal:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1778885000; cv=none; b=XZwAJuCIMcG1csYbiarZAdMwe8cfWNFXzrKZiI+5iqpfdDSJKsHiLA3pAhg3lXv/ed+UeYxNxA2/OPgwIqSO5wSEb65OmEPq/2b6KmdKWTeWud+nxxolJ+da0J2B/CVDtHNFqZCEgtlnOlY8wCvAKrbZO6vSls+W4D1k3+y/0XE= ARC-Message-Signature:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1778885000; c=relaxed/simple; bh=kaYeoiBhKH8QIrdUuVmAazULlTKQl2EsXPfmNkamrFs=; h=Date:From:To:Cc:Subject:Message-ID:References:MIME-Version: Content-Type:Content-Disposition:In-Reply-To; b=gHGts3ZxT0UEuP+xozjUJgM2bUgu8OseZsZgb/T50YKkvUVvNfMWnS93ecMyjzmhjd4me+GiB9rZYHsskIcvKOaADB1N8kxZPxliiVm8iEz+1wdt2pTrSmlI1Vq1jmInxVhuHzMGxxqbIJWo1SXnauy4O9sSIrx58KYXh1np3uI= ARC-Authentication-Results:i=1; smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=ziepe.ca; spf=pass smtp.mailfrom=ziepe.ca; dkim=pass (2048-bit key) header.d=ziepe.ca header.i=@ziepe.ca header.b=PTd/6vjH; arc=none smtp.client-ip=209.85.160.172 Authentication-Results: smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=ziepe.ca Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=ziepe.ca Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=ziepe.ca header.i=@ziepe.ca header.b="PTd/6vjH" Received: by mail-qt1-f172.google.com with SMTP id d75a77b69052e-50e614fdb42so4124601cf.3 for ; Fri, 15 May 2026 15:43:19 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=ziepe.ca; s=google; t=1778884998; x=1779489798; darn=vger.kernel.org; h=in-reply-to:content-disposition:mime-version:references:message-id :subject:cc:to:from:date:from:to:cc:subject:date:message-id:reply-to; bh=COahKpUTP3FbIp/9gGBiaABm/08X7eZmQdMgy3y6jxs=; b=PTd/6vjHD5cz7wUIIzVrooVqsPdaUiAF+/t88I4s1NPuG6U0jKuo8mFfqxiJ/EKPFL BlVVz1URCYknZa6ZiLXwbTtn1g+lkVdB6hio9UZM9ef8JmE0rW1k14gZ4xnBbicwnPAA g6Pl6XVhqLxdAhjEDnKqBBtTxGk9DALT9qgw4tGrqA/QA+vs/no0jayO+EZ8BZwxn+k/ a8ofcoHoH4Q7a8Pq87YNXkYVGfJEhRLTC2ilx7IMfWWXZU+W56+fjIDbQqh72yugnLpS SKJGnlcvTBxnFeIA/38l2/sFxNiht9o5F63u8K4SzWHc8ctLFwxIZD6oxvB3keMw0zkF 0MUQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1778884998; x=1779489798; h=in-reply-to:content-disposition:mime-version:references:message-id :subject:cc:to:from:date:x-gm-gg:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=COahKpUTP3FbIp/9gGBiaABm/08X7eZmQdMgy3y6jxs=; b=jW7spIjUglXHjvto2aB/UUUV/Y4HWH1pm3dJka76nKSrFEjl1Fc7Er4J9R3dXDgcd0 JQmVLUji+eRzfH3Cw37l5YsYP0RS9HuMEclIvosBIxsCpwQoun8/6alTcoyGHOikVQr9 r+GSHxC+Urjc1rqZyjFXZRuD5KdYEt6rulDokQm143b/1GLMHYt7eTaRgb52P0VwLAFI dCw2yLEiTPJBVvKRIAkXMAEAn7wAG/M+lW92FvYCbYJrf643baa3kHSeteNp2CGPahDX 7pEpYhQhJEEXrhQDD0qekGn3vvfB+kdU4NvyXDJAOg78YXzj8cTSgzdFUcXrlP0YMUlw 0N6g== X-Gm-Message-State: AOJu0YxWUHpjrtroSMgZKJCK3gbF0h/9rRZisxZuoy1x/mlDcz1+ajO6 fRWBTAvLTpV1iRyBNQWBOi2va8fc2EAJhY5IUPa4kwe0nB7I7jKwX3bWFGpa9HnZPtQ= X-Gm-Gg: Acq92OE6fx2iAZ9gpE3Aryv0BglLA2P2Iv8FgeLR3fZDJPVFmbPzF3tVHScleGuEn+y EWmT/pnJ+Ev3lTrmdqk9rDLLdonfgkE+JhvIKjBsAXYMDN+uN4u4HvaHnDamSxuNAJNdPeGxt5a YkiyiBVgsIqfcSRY74p4eZqsaJpVRrUbxCQ9aMVS4vkAVikzJqH0MpIbJ3DRCxNx9Ebcu5HjvjU ks8BqT73Z2jFg5gn9oxSRrbt2LxqHB45gb8oj8iqMlcmEutAqvBZca5wk0nszE96+pAHY1SN9Lk ZsPu5xtKECdSiKK0AY4zXodntaLvTn6H+cMyIa+9gvXwe41bPdsQmoyH7eC71x66ucyT5TmlHVg jeZqwGFP4qoe57ONIEJugArM0kXkLx+DTQiwk2dZDskMFriayK2MLJkLIqUPLR/C7TG6drGziI4 A0UimxRJnpsJ/kwRV2l/QjcxZRQRGRhCHw+RYSxBx3gMt2I/C3NvK3WTuiajA3eyOdst1gO7M3D Gii7A== X-Received: by 2002:a05:622a:5814:b0:50d:9b4a:e6f with SMTP id d75a77b69052e-5165a012120mr85384381cf.1.1778884998371; Fri, 15 May 2026 15:43:18 -0700 (PDT) Received: from ziepe.ca (crbknf0213w-47-54-130-67.pppoe-dynamic.high-speed.nl.bellaliant.net. [47.54.130.67]) by smtp.gmail.com with ESMTPSA id d75a77b69052e-51645856d10sm56007601cf.26.2026.05.15.15.43.17 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 15 May 2026 15:43:17 -0700 (PDT) Received: from jgg by wakko with local (Exim 4.97) (envelope-from ) id 1wO1FV-00000008F2P-03Ci; Fri, 15 May 2026 19:43:17 -0300 Date: Fri, 15 May 2026 19:43:17 -0300 From: Jason Gunthorpe To: Rik van Riel 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 Subject: Re: [PATCH 5/5] iova: add KUnit test suite Message-ID: <20260515224317.GM7702@ziepe.ca> References: <20260513020304.1528751-1-riel@surriel.com> <20260513020304.1528751-6-riel@surriel.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline 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 > > 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