Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

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: Arunpravin <Arunpravin.PaneerSelvam@amd.com>
Reviewed-by: Matthew Auld <matthew.auld@intel.com>
Acked-by: Christian König <christian.koenig@amd.com>
Link: https://patchwork.freedesktop.org/patch/msgid/20220222174845.2175-2-Arunpravin.PaneerSelvam@amd.com
Signed-off-by: Christian König <christian.koenig@amd.com>

authored by

Arunpravin and committed by
Christian König
cb8f00f2 3d515ba9

+60
+1
drivers/gpu/drm/selftests/drm_buddy_selftests.h
··· 7 7 * Tests are executed in order by igt/drm_buddy 8 8 */ 9 9 selftest(sanitycheck, igt_sanitycheck) /* keep first (selfcheck for igt) */ 10 + selftest(buddy_alloc_limit, igt_buddy_alloc_limit)
+59
drivers/gpu/drm/selftests/test-drm_buddy.c
··· 16 16 17 17 static unsigned int random_seed; 18 18 19 + static int igt_buddy_alloc_limit(void *arg) 20 + { 21 + u64 end, size = U64_MAX, start = 0; 22 + struct drm_buddy_block *block; 23 + unsigned long flags = 0; 24 + LIST_HEAD(allocated); 25 + struct drm_buddy mm; 26 + int err; 27 + 28 + size = end = round_down(size, 4096); 29 + err = drm_buddy_init(&mm, size, PAGE_SIZE); 30 + if (err) 31 + return err; 32 + 33 + if (mm.max_order != DRM_BUDDY_MAX_ORDER) { 34 + pr_err("mm.max_order(%d) != %d\n", 35 + mm.max_order, DRM_BUDDY_MAX_ORDER); 36 + err = -EINVAL; 37 + goto out_fini; 38 + } 39 + 40 + err = drm_buddy_alloc_blocks(&mm, start, end, size, 41 + PAGE_SIZE, &allocated, flags); 42 + 43 + if (unlikely(err)) 44 + goto out_free; 45 + 46 + block = list_first_entry_or_null(&allocated, 47 + struct drm_buddy_block, 48 + link); 49 + 50 + if (!block) { 51 + err = -EINVAL; 52 + goto out_fini; 53 + } 54 + 55 + if (drm_buddy_block_order(block) != mm.max_order) { 56 + pr_err("block order(%d) != %d\n", 57 + drm_buddy_block_order(block), mm.max_order); 58 + err = -EINVAL; 59 + goto out_free; 60 + } 61 + 62 + if (drm_buddy_block_size(&mm, block) != 63 + BIT_ULL(mm.max_order) * PAGE_SIZE) { 64 + pr_err("block size(%llu) != %llu\n", 65 + drm_buddy_block_size(&mm, block), 66 + BIT_ULL(mm.max_order) * PAGE_SIZE); 67 + err = -EINVAL; 68 + goto out_free; 69 + } 70 + 71 + out_free: 72 + drm_buddy_free_list(&mm, &allocated); 73 + out_fini: 74 + drm_buddy_fini(&mm); 75 + return err; 76 + } 77 + 19 78 static int igt_sanitycheck(void *ignored) 20 79 { 21 80 pr_info("%s - ok!\n", __func__);