On Thu, 26 Dec 2024, Arunpravin Paneer Selvam <Arunpravin.PaneerSelvam@xxxxxxx> wrote: > - Added a testcase to verify the multiroot force merge fini. > - Added a new field in_use to track the mm freed status. > > v2:(Matthew) > - Add kunit_fail_current_test() when WARN_ON is true. This i.e. commit 8cb3a1e2b350 ("drm/buddy: Add a testcase to verify the multiroot fini") fails drm-tip build for me with: In file included from ../drivers/gpu/drm/tests/drm_buddy_test.c:15: ../drivers/gpu/drm/tests/drm_buddy_test.c: In function ‘drm_test_buddy_alloc_clear’: ../drivers/gpu/drm/tests/drm_buddy_test.c:264:23: error: unused variable ‘prng’ [-Werror=unused-variable] 264 | DRM_RND_STATE(prng, random_seed); | ^~~~ ../drivers/gpu/drm/tests/../lib/drm_random.h:18:26: note: in definition of macro ‘DRM_RND_STATE’ 18 | struct rnd_state name__ = DRM_RND_STATE_INITIALIZER(seed__) | ^~~~~~ cc1: all warnings being treated as errors BR, Jani. > > Signed-off-by: Arunpravin Paneer Selvam <Arunpravin.PaneerSelvam@xxxxxxx> > Signed-off-by: Lin.Cao <lincao12@xxxxxxx> > --- > drivers/gpu/drm/drm_buddy.c | 6 +++++- > drivers/gpu/drm/tests/drm_buddy_test.c | 29 ++++++++++++++++++-------- > 2 files changed, 25 insertions(+), 10 deletions(-) > > diff --git a/drivers/gpu/drm/drm_buddy.c b/drivers/gpu/drm/drm_buddy.c > index ca42e6081d27..241c855f891f 100644 > --- a/drivers/gpu/drm/drm_buddy.c > +++ b/drivers/gpu/drm/drm_buddy.c > @@ -3,6 +3,8 @@ > * Copyright © 2021 Intel Corporation > */ > > +#include <kunit/test-bug.h> > + > #include <linux/kmemleak.h> > #include <linux/module.h> > #include <linux/sizes.h> > @@ -335,7 +337,9 @@ void drm_buddy_fini(struct drm_buddy *mm) > start = drm_buddy_block_offset(mm->roots[i]); > __force_merge(mm, start, start + size, order); > > - WARN_ON(!drm_buddy_block_is_free(mm->roots[i])); > + if (WARN_ON(!drm_buddy_block_is_free(mm->roots[i]))) > + kunit_fail_current_test("buddy_fini() root"); > + > drm_block_free(mm, mm->roots[i]); > > root_size = mm->chunk_size << order; > diff --git a/drivers/gpu/drm/tests/drm_buddy_test.c b/drivers/gpu/drm/tests/drm_buddy_test.c > index 9662c949d0e3..4b5818f9f2a9 100644 > --- a/drivers/gpu/drm/tests/drm_buddy_test.c > +++ b/drivers/gpu/drm/tests/drm_buddy_test.c > @@ -385,17 +385,28 @@ static void drm_test_buddy_alloc_clear(struct kunit *test) > drm_buddy_fini(&mm); > > /* > - * Create a new mm with a non power-of-two size. Allocate a random size, free as > - * cleared and then call fini. This will ensure the multi-root force merge during > - * fini. > + * Create a new mm with a non power-of-two size. Allocate a random size from each > + * root, free as cleared and then call fini. This will ensure the multi-root > + * force merge during fini. > */ > - mm_size = 12 * SZ_4K; > - size = max(round_up(prandom_u32_state(&prng) % mm_size, ps), ps); > + mm_size = (SZ_4K << max_order) + (SZ_4K << (max_order - 2)); > + > KUNIT_EXPECT_FALSE(test, drm_buddy_init(&mm, mm_size, ps)); > - KUNIT_ASSERT_FALSE_MSG(test, drm_buddy_alloc_blocks(&mm, 0, mm_size, > - size, ps, &allocated, > - DRM_BUDDY_TOPDOWN_ALLOCATION), > - "buddy_alloc hit an error size=%u\n", size); > + KUNIT_EXPECT_EQ(test, mm.max_order, max_order); > + KUNIT_ASSERT_FALSE_MSG(test, drm_buddy_alloc_blocks(&mm, 0, SZ_4K << max_order, > + 4 * ps, ps, &allocated, > + DRM_BUDDY_RANGE_ALLOCATION), > + "buddy_alloc hit an error size=%lu\n", 4 * ps); > + drm_buddy_free_list(&mm, &allocated, DRM_BUDDY_CLEARED); > + KUNIT_ASSERT_FALSE_MSG(test, drm_buddy_alloc_blocks(&mm, 0, SZ_4K << max_order, > + 2 * ps, ps, &allocated, > + DRM_BUDDY_CLEAR_ALLOCATION), > + "buddy_alloc hit an error size=%lu\n", 2 * ps); > + drm_buddy_free_list(&mm, &allocated, DRM_BUDDY_CLEARED); > + KUNIT_ASSERT_FALSE_MSG(test, drm_buddy_alloc_blocks(&mm, SZ_4K << max_order, mm_size, > + ps, ps, &allocated, > + DRM_BUDDY_RANGE_ALLOCATION), > + "buddy_alloc hit an error size=%lu\n", ps); > drm_buddy_free_list(&mm, &allocated, DRM_BUDDY_CLEARED); > drm_buddy_fini(&mm); > } -- Jani Nikula, Intel