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.paneersel...@amd.com>
Signed-off-by: Lin.Cao <linca...@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);
  }

Reply via email to