[v2,2/2] drm/buddy: Add a testcase to verify the multiroot fini

Hellstrom, Thomas thomas.hellstrom at intel.com
Wed Jan 15 12:12:20 UTC 2025


Hi!

On Thu, 2024-12-26 at 12:31 +0530, 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>
> Reviewed-by: Matthew Auld <matthew.auld at intel.com>
> ---
>  drivers/gpu/drm/drm_buddy.c            |  6 +++++-
>  drivers/gpu/drm/tests/drm_buddy_test.c | 29 ++++++++++++++++++------
> --
>  2 files changed, 25 insertions(+), 10 deletions(-)

It appears this patch breaks drm-tip:

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__)
      |                          ^~~~~~
 

Thanks,
Thomas

> 
> 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 dri-devel mailing list