Commit 8cb3a1e2 authored by Arunpravin Paneer Selvam's avatar Arunpravin Paneer Selvam
Browse files

drm/buddy: Add a testcase to verify the multiroot fini



- 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: default avatarArunpravin Paneer Selvam <Arunpravin.PaneerSelvam@amd.com>
Signed-off-by: default avatarLin.Cao <lincao12@amd.com>
Reviewed-by: default avatarMatthew Auld <matthew.auld@intel.com>
Link: https://patchwork.freedesktop.org/patch/msgid/20241226070116.309290-2-Arunpravin.PaneerSelvam@amd.com
parent 467dce38
Loading
Loading
Loading
Loading
+5 −1
Original line number Diff line number Diff line
@@ -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;
+20 −9
Original line number Diff line number Diff line
@@ -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);
}