From e3335ccbf4dac1a73063db2f875a4478c0c85e75 Mon Sep 17 00:00:00 2001 From: Arunpravin Paneer Selvam Date: Tue, 21 Jul 2026 17:12:36 +0530 Subject: [PATCH] drm/tests/gpu_buddy: add a new test case for buffer clearance during resume Add a new unit test case for buffer clearance issue during resume. Using a non-power-of-two mm size, allocate alternating blocks of 4KiB in an even sequence and free them as cleared. All alternate blocks should be marked as dirty and the split blocks should be merged back to their original size when the blocks clear reset function is called. Signed-off-by: Arunpravin Paneer Selvam Reviewed-by: Matthew Auld Link: https://patch.msgid.link/20260721114236.507578-1-Arunpravin.PaneerSelvam@amd.com --- drivers/gpu/tests/gpu_buddy_test.c | 41 ++++++++++++++++++++++++++++++ 1 file changed, 41 insertions(+) diff --git a/drivers/gpu/tests/gpu_buddy_test.c b/drivers/gpu/tests/gpu_buddy_test.c index 7df5c2ae83bb..89698563c61b 100644 --- a/drivers/gpu/tests/gpu_buddy_test.c +++ b/drivers/gpu/tests/gpu_buddy_test.c @@ -1002,6 +1002,47 @@ static void gpu_test_buddy_alloc_clear(struct kunit *test) "buddy_alloc hit an error size=%lu\n", ps); gpu_buddy_free_list(&mm, &allocated, GPU_BUDDY_CLEARED); gpu_buddy_fini(&mm); + + /* + * Using a non-power-of-two mm size, allocate alternating blocks of 4KiB in an + * even sequence and free them as cleared. All blocks should be marked as + * dirty and the split blocks should be merged back to their original + * size when the blocks clear reset function is called. + */ + KUNIT_EXPECT_FALSE(test, gpu_buddy_init(&mm, mm_size, ps)); + KUNIT_EXPECT_EQ(test, mm.max_order, max_order); + + i = 0; + n_pages = mm_size / ps; + do { + if (i % 2 == 0) + KUNIT_ASSERT_FALSE_MSG(test, gpu_buddy_alloc_blocks(&mm, 0, mm_size, + ps, ps, &allocated, 0), + "buddy_alloc hit an error size=%lu\n", ps); + } while (++i < n_pages); + + gpu_buddy_free_list(&mm, &allocated, GPU_BUDDY_CLEARED); + gpu_buddy_reset_clear(&mm, false); + KUNIT_EXPECT_EQ(test, mm.clear_avail, 0); + + /* + * Using a non-power-of-two mm size, allocate alternating blocks of 4KiB in an + * odd sequence and free them as cleared. All blocks should be marked as + * cleared and the split blocks should be merged back to their original + * size when the blocks clear reset function is called. + */ + i = 0; + do { + if (i % 2 != 0) + KUNIT_ASSERT_FALSE_MSG(test, gpu_buddy_alloc_blocks(&mm, 0, mm_size, + ps, ps, &allocated, 0), + "buddy_alloc hit an error size=%lu\n", ps); + } while (++i < n_pages); + + gpu_buddy_free_list(&mm, &allocated, GPU_BUDDY_CLEARED); + gpu_buddy_reset_clear(&mm, true); + KUNIT_EXPECT_EQ(test, mm.clear_avail, mm_size); + gpu_buddy_fini(&mm); } static void gpu_test_buddy_alloc_contiguous(struct kunit *test)