Commit cb8f00f2 authored by Arunpravin's avatar Arunpravin Committed by Christian König
Browse files

drm/selftests: add drm buddy alloc limit testcase



add a test to check the maximum allocation limit

v2(Matthew Auld):
  - added err = -EINVAL in block NULL check
  - removed unnecessary test succeeded print

Signed-off-by: default avatarArunpravin <Arunpravin.PaneerSelvam@amd.com>
Reviewed-by: default avatarMatthew Auld <matthew.auld@intel.com>
Acked-by: default avatarChristian König <christian.koenig@amd.com>
Link: https://patchwork.freedesktop.org/patch/msgid/20220222174845.2175-2-Arunpravin.PaneerSelvam@amd.com


Signed-off-by: default avatarChristian König <christian.koenig@amd.com>
parent 3d515ba9
Loading
Loading
Loading
Loading
+1 −0
Original line number Diff line number Diff line
@@ -7,3 +7,4 @@
 * Tests are executed in order by igt/drm_buddy
 */
selftest(sanitycheck, igt_sanitycheck) /* keep first (selfcheck for igt) */
selftest(buddy_alloc_limit, igt_buddy_alloc_limit)
+59 −0
Original line number Diff line number Diff line
@@ -16,6 +16,65 @@

static unsigned int random_seed;

static int igt_buddy_alloc_limit(void *arg)
{
	u64 end, size = U64_MAX, start = 0;
	struct drm_buddy_block *block;
	unsigned long flags = 0;
	LIST_HEAD(allocated);
	struct drm_buddy mm;
	int err;

	size = end = round_down(size, 4096);
	err = drm_buddy_init(&mm, size, PAGE_SIZE);
	if (err)
		return err;

	if (mm.max_order != DRM_BUDDY_MAX_ORDER) {
		pr_err("mm.max_order(%d) != %d\n",
		       mm.max_order, DRM_BUDDY_MAX_ORDER);
		err = -EINVAL;
		goto out_fini;
	}

	err = drm_buddy_alloc_blocks(&mm, start, end, size,
				     PAGE_SIZE, &allocated, flags);

	if (unlikely(err))
		goto out_free;

	block = list_first_entry_or_null(&allocated,
					 struct drm_buddy_block,
					 link);

	if (!block) {
		err = -EINVAL;
		goto out_fini;
	}

	if (drm_buddy_block_order(block) != mm.max_order) {
		pr_err("block order(%d) != %d\n",
		       drm_buddy_block_order(block), mm.max_order);
		err = -EINVAL;
		goto out_free;
	}

	if (drm_buddy_block_size(&mm, block) !=
	    BIT_ULL(mm.max_order) * PAGE_SIZE) {
		pr_err("block size(%llu) != %llu\n",
		       drm_buddy_block_size(&mm, block),
		       BIT_ULL(mm.max_order) * PAGE_SIZE);
		err = -EINVAL;
		goto out_free;
	}

out_free:
	drm_buddy_free_list(&mm, &allocated);
out_fini:
	drm_buddy_fini(&mm);
	return err;
}

static int igt_sanitycheck(void *ignored)
{
	pr_info("%s - ok!\n", __func__);