[PATCH v2 2/2] drm/buddy: Add a testcase to verify the multiroot fini
Paneer Selvam, Arunpravin
arunpravin.paneerselvam at amd.com
Mon Jan 6 12:37:11 UTC 2025
Hi Matthew,
Ping?
Regards,
Arun.
On 12/26/2024 12:31 PM, Arunpravin Paneer Selvam 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.
>
> Signed-off-by: Arunpravin Paneer Selvam <Arunpravin.PaneerSelvam at amd.com>
> Signed-off-by: Lin.Cao <lincao12 at amd.com>
> ---
> 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);
> }
More information about the amd-gfx
mailing list