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

Matthew Auld matthew.auld at intel.com
Mon Jan 6 12:40:22 UTC 2025


Hey,

On 06/01/2025 12:37, Paneer Selvam, Arunpravin wrote:
> Hi Matthew,
> 
> Ping?

Just got back from time off. I already slapped an r-b here: 
https://lore.kernel.org/dri-devel/aa27455c-04b8-494c-a3b5-c4385a7748bc@intel.com/

> 
> 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