18c2ecf20Sopenharmony_ci// SPDX-License-Identifier: MIT 28c2ecf20Sopenharmony_ci/* 38c2ecf20Sopenharmony_ci * Copyright © 2019 Intel Corporation 48c2ecf20Sopenharmony_ci */ 58c2ecf20Sopenharmony_ci 68c2ecf20Sopenharmony_ci#include <linux/prime_numbers.h> 78c2ecf20Sopenharmony_ci 88c2ecf20Sopenharmony_ci#include "../i915_selftest.h" 98c2ecf20Sopenharmony_ci#include "i915_random.h" 108c2ecf20Sopenharmony_ci 118c2ecf20Sopenharmony_cistatic void __igt_dump_block(struct i915_buddy_mm *mm, 128c2ecf20Sopenharmony_ci struct i915_buddy_block *block, 138c2ecf20Sopenharmony_ci bool buddy) 148c2ecf20Sopenharmony_ci{ 158c2ecf20Sopenharmony_ci pr_err("block info: header=%llx, state=%u, order=%d, offset=%llx size=%llx root=%s buddy=%s\n", 168c2ecf20Sopenharmony_ci block->header, 178c2ecf20Sopenharmony_ci i915_buddy_block_state(block), 188c2ecf20Sopenharmony_ci i915_buddy_block_order(block), 198c2ecf20Sopenharmony_ci i915_buddy_block_offset(block), 208c2ecf20Sopenharmony_ci i915_buddy_block_size(mm, block), 218c2ecf20Sopenharmony_ci yesno(!block->parent), 228c2ecf20Sopenharmony_ci yesno(buddy)); 238c2ecf20Sopenharmony_ci} 248c2ecf20Sopenharmony_ci 258c2ecf20Sopenharmony_cistatic void igt_dump_block(struct i915_buddy_mm *mm, 268c2ecf20Sopenharmony_ci struct i915_buddy_block *block) 278c2ecf20Sopenharmony_ci{ 288c2ecf20Sopenharmony_ci struct i915_buddy_block *buddy; 298c2ecf20Sopenharmony_ci 308c2ecf20Sopenharmony_ci __igt_dump_block(mm, block, false); 318c2ecf20Sopenharmony_ci 328c2ecf20Sopenharmony_ci buddy = get_buddy(block); 338c2ecf20Sopenharmony_ci if (buddy) 348c2ecf20Sopenharmony_ci __igt_dump_block(mm, buddy, true); 358c2ecf20Sopenharmony_ci} 368c2ecf20Sopenharmony_ci 378c2ecf20Sopenharmony_cistatic int igt_check_block(struct i915_buddy_mm *mm, 388c2ecf20Sopenharmony_ci struct i915_buddy_block *block) 398c2ecf20Sopenharmony_ci{ 408c2ecf20Sopenharmony_ci struct i915_buddy_block *buddy; 418c2ecf20Sopenharmony_ci unsigned int block_state; 428c2ecf20Sopenharmony_ci u64 block_size; 438c2ecf20Sopenharmony_ci u64 offset; 448c2ecf20Sopenharmony_ci int err = 0; 458c2ecf20Sopenharmony_ci 468c2ecf20Sopenharmony_ci block_state = i915_buddy_block_state(block); 478c2ecf20Sopenharmony_ci 488c2ecf20Sopenharmony_ci if (block_state != I915_BUDDY_ALLOCATED && 498c2ecf20Sopenharmony_ci block_state != I915_BUDDY_FREE && 508c2ecf20Sopenharmony_ci block_state != I915_BUDDY_SPLIT) { 518c2ecf20Sopenharmony_ci pr_err("block state mismatch\n"); 528c2ecf20Sopenharmony_ci err = -EINVAL; 538c2ecf20Sopenharmony_ci } 548c2ecf20Sopenharmony_ci 558c2ecf20Sopenharmony_ci block_size = i915_buddy_block_size(mm, block); 568c2ecf20Sopenharmony_ci offset = i915_buddy_block_offset(block); 578c2ecf20Sopenharmony_ci 588c2ecf20Sopenharmony_ci if (block_size < mm->chunk_size) { 598c2ecf20Sopenharmony_ci pr_err("block size smaller than min size\n"); 608c2ecf20Sopenharmony_ci err = -EINVAL; 618c2ecf20Sopenharmony_ci } 628c2ecf20Sopenharmony_ci 638c2ecf20Sopenharmony_ci if (!is_power_of_2(block_size)) { 648c2ecf20Sopenharmony_ci pr_err("block size not power of two\n"); 658c2ecf20Sopenharmony_ci err = -EINVAL; 668c2ecf20Sopenharmony_ci } 678c2ecf20Sopenharmony_ci 688c2ecf20Sopenharmony_ci if (!IS_ALIGNED(block_size, mm->chunk_size)) { 698c2ecf20Sopenharmony_ci pr_err("block size not aligned to min size\n"); 708c2ecf20Sopenharmony_ci err = -EINVAL; 718c2ecf20Sopenharmony_ci } 728c2ecf20Sopenharmony_ci 738c2ecf20Sopenharmony_ci if (!IS_ALIGNED(offset, mm->chunk_size)) { 748c2ecf20Sopenharmony_ci pr_err("block offset not aligned to min size\n"); 758c2ecf20Sopenharmony_ci err = -EINVAL; 768c2ecf20Sopenharmony_ci } 778c2ecf20Sopenharmony_ci 788c2ecf20Sopenharmony_ci if (!IS_ALIGNED(offset, block_size)) { 798c2ecf20Sopenharmony_ci pr_err("block offset not aligned to block size\n"); 808c2ecf20Sopenharmony_ci err = -EINVAL; 818c2ecf20Sopenharmony_ci } 828c2ecf20Sopenharmony_ci 838c2ecf20Sopenharmony_ci buddy = get_buddy(block); 848c2ecf20Sopenharmony_ci 858c2ecf20Sopenharmony_ci if (!buddy && block->parent) { 868c2ecf20Sopenharmony_ci pr_err("buddy has gone fishing\n"); 878c2ecf20Sopenharmony_ci err = -EINVAL; 888c2ecf20Sopenharmony_ci } 898c2ecf20Sopenharmony_ci 908c2ecf20Sopenharmony_ci if (buddy) { 918c2ecf20Sopenharmony_ci if (i915_buddy_block_offset(buddy) != (offset ^ block_size)) { 928c2ecf20Sopenharmony_ci pr_err("buddy has wrong offset\n"); 938c2ecf20Sopenharmony_ci err = -EINVAL; 948c2ecf20Sopenharmony_ci } 958c2ecf20Sopenharmony_ci 968c2ecf20Sopenharmony_ci if (i915_buddy_block_size(mm, buddy) != block_size) { 978c2ecf20Sopenharmony_ci pr_err("buddy size mismatch\n"); 988c2ecf20Sopenharmony_ci err = -EINVAL; 998c2ecf20Sopenharmony_ci } 1008c2ecf20Sopenharmony_ci 1018c2ecf20Sopenharmony_ci if (i915_buddy_block_state(buddy) == block_state && 1028c2ecf20Sopenharmony_ci block_state == I915_BUDDY_FREE) { 1038c2ecf20Sopenharmony_ci pr_err("block and its buddy are free\n"); 1048c2ecf20Sopenharmony_ci err = -EINVAL; 1058c2ecf20Sopenharmony_ci } 1068c2ecf20Sopenharmony_ci } 1078c2ecf20Sopenharmony_ci 1088c2ecf20Sopenharmony_ci return err; 1098c2ecf20Sopenharmony_ci} 1108c2ecf20Sopenharmony_ci 1118c2ecf20Sopenharmony_cistatic int igt_check_blocks(struct i915_buddy_mm *mm, 1128c2ecf20Sopenharmony_ci struct list_head *blocks, 1138c2ecf20Sopenharmony_ci u64 expected_size, 1148c2ecf20Sopenharmony_ci bool is_contiguous) 1158c2ecf20Sopenharmony_ci{ 1168c2ecf20Sopenharmony_ci struct i915_buddy_block *block; 1178c2ecf20Sopenharmony_ci struct i915_buddy_block *prev; 1188c2ecf20Sopenharmony_ci u64 total; 1198c2ecf20Sopenharmony_ci int err = 0; 1208c2ecf20Sopenharmony_ci 1218c2ecf20Sopenharmony_ci block = NULL; 1228c2ecf20Sopenharmony_ci prev = NULL; 1238c2ecf20Sopenharmony_ci total = 0; 1248c2ecf20Sopenharmony_ci 1258c2ecf20Sopenharmony_ci list_for_each_entry(block, blocks, link) { 1268c2ecf20Sopenharmony_ci err = igt_check_block(mm, block); 1278c2ecf20Sopenharmony_ci 1288c2ecf20Sopenharmony_ci if (!i915_buddy_block_is_allocated(block)) { 1298c2ecf20Sopenharmony_ci pr_err("block not allocated\n"), 1308c2ecf20Sopenharmony_ci err = -EINVAL; 1318c2ecf20Sopenharmony_ci } 1328c2ecf20Sopenharmony_ci 1338c2ecf20Sopenharmony_ci if (is_contiguous && prev) { 1348c2ecf20Sopenharmony_ci u64 prev_block_size; 1358c2ecf20Sopenharmony_ci u64 prev_offset; 1368c2ecf20Sopenharmony_ci u64 offset; 1378c2ecf20Sopenharmony_ci 1388c2ecf20Sopenharmony_ci prev_offset = i915_buddy_block_offset(prev); 1398c2ecf20Sopenharmony_ci prev_block_size = i915_buddy_block_size(mm, prev); 1408c2ecf20Sopenharmony_ci offset = i915_buddy_block_offset(block); 1418c2ecf20Sopenharmony_ci 1428c2ecf20Sopenharmony_ci if (offset != (prev_offset + prev_block_size)) { 1438c2ecf20Sopenharmony_ci pr_err("block offset mismatch\n"); 1448c2ecf20Sopenharmony_ci err = -EINVAL; 1458c2ecf20Sopenharmony_ci } 1468c2ecf20Sopenharmony_ci } 1478c2ecf20Sopenharmony_ci 1488c2ecf20Sopenharmony_ci if (err) 1498c2ecf20Sopenharmony_ci break; 1508c2ecf20Sopenharmony_ci 1518c2ecf20Sopenharmony_ci total += i915_buddy_block_size(mm, block); 1528c2ecf20Sopenharmony_ci prev = block; 1538c2ecf20Sopenharmony_ci } 1548c2ecf20Sopenharmony_ci 1558c2ecf20Sopenharmony_ci if (!err) { 1568c2ecf20Sopenharmony_ci if (total != expected_size) { 1578c2ecf20Sopenharmony_ci pr_err("size mismatch, expected=%llx, found=%llx\n", 1588c2ecf20Sopenharmony_ci expected_size, total); 1598c2ecf20Sopenharmony_ci err = -EINVAL; 1608c2ecf20Sopenharmony_ci } 1618c2ecf20Sopenharmony_ci return err; 1628c2ecf20Sopenharmony_ci } 1638c2ecf20Sopenharmony_ci 1648c2ecf20Sopenharmony_ci if (prev) { 1658c2ecf20Sopenharmony_ci pr_err("prev block, dump:\n"); 1668c2ecf20Sopenharmony_ci igt_dump_block(mm, prev); 1678c2ecf20Sopenharmony_ci } 1688c2ecf20Sopenharmony_ci 1698c2ecf20Sopenharmony_ci if (block) { 1708c2ecf20Sopenharmony_ci pr_err("bad block, dump:\n"); 1718c2ecf20Sopenharmony_ci igt_dump_block(mm, block); 1728c2ecf20Sopenharmony_ci } 1738c2ecf20Sopenharmony_ci 1748c2ecf20Sopenharmony_ci return err; 1758c2ecf20Sopenharmony_ci} 1768c2ecf20Sopenharmony_ci 1778c2ecf20Sopenharmony_cistatic int igt_check_mm(struct i915_buddy_mm *mm) 1788c2ecf20Sopenharmony_ci{ 1798c2ecf20Sopenharmony_ci struct i915_buddy_block *root; 1808c2ecf20Sopenharmony_ci struct i915_buddy_block *prev; 1818c2ecf20Sopenharmony_ci unsigned int i; 1828c2ecf20Sopenharmony_ci u64 total; 1838c2ecf20Sopenharmony_ci int err = 0; 1848c2ecf20Sopenharmony_ci 1858c2ecf20Sopenharmony_ci if (!mm->n_roots) { 1868c2ecf20Sopenharmony_ci pr_err("n_roots is zero\n"); 1878c2ecf20Sopenharmony_ci return -EINVAL; 1888c2ecf20Sopenharmony_ci } 1898c2ecf20Sopenharmony_ci 1908c2ecf20Sopenharmony_ci if (mm->n_roots != hweight64(mm->size)) { 1918c2ecf20Sopenharmony_ci pr_err("n_roots mismatch, n_roots=%u, expected=%lu\n", 1928c2ecf20Sopenharmony_ci mm->n_roots, hweight64(mm->size)); 1938c2ecf20Sopenharmony_ci return -EINVAL; 1948c2ecf20Sopenharmony_ci } 1958c2ecf20Sopenharmony_ci 1968c2ecf20Sopenharmony_ci root = NULL; 1978c2ecf20Sopenharmony_ci prev = NULL; 1988c2ecf20Sopenharmony_ci total = 0; 1998c2ecf20Sopenharmony_ci 2008c2ecf20Sopenharmony_ci for (i = 0; i < mm->n_roots; ++i) { 2018c2ecf20Sopenharmony_ci struct i915_buddy_block *block; 2028c2ecf20Sopenharmony_ci unsigned int order; 2038c2ecf20Sopenharmony_ci 2048c2ecf20Sopenharmony_ci root = mm->roots[i]; 2058c2ecf20Sopenharmony_ci if (!root) { 2068c2ecf20Sopenharmony_ci pr_err("root(%u) is NULL\n", i); 2078c2ecf20Sopenharmony_ci err = -EINVAL; 2088c2ecf20Sopenharmony_ci break; 2098c2ecf20Sopenharmony_ci } 2108c2ecf20Sopenharmony_ci 2118c2ecf20Sopenharmony_ci err = igt_check_block(mm, root); 2128c2ecf20Sopenharmony_ci 2138c2ecf20Sopenharmony_ci if (!i915_buddy_block_is_free(root)) { 2148c2ecf20Sopenharmony_ci pr_err("root not free\n"); 2158c2ecf20Sopenharmony_ci err = -EINVAL; 2168c2ecf20Sopenharmony_ci } 2178c2ecf20Sopenharmony_ci 2188c2ecf20Sopenharmony_ci order = i915_buddy_block_order(root); 2198c2ecf20Sopenharmony_ci 2208c2ecf20Sopenharmony_ci if (!i) { 2218c2ecf20Sopenharmony_ci if (order != mm->max_order) { 2228c2ecf20Sopenharmony_ci pr_err("max order root missing\n"); 2238c2ecf20Sopenharmony_ci err = -EINVAL; 2248c2ecf20Sopenharmony_ci } 2258c2ecf20Sopenharmony_ci } 2268c2ecf20Sopenharmony_ci 2278c2ecf20Sopenharmony_ci if (prev) { 2288c2ecf20Sopenharmony_ci u64 prev_block_size; 2298c2ecf20Sopenharmony_ci u64 prev_offset; 2308c2ecf20Sopenharmony_ci u64 offset; 2318c2ecf20Sopenharmony_ci 2328c2ecf20Sopenharmony_ci prev_offset = i915_buddy_block_offset(prev); 2338c2ecf20Sopenharmony_ci prev_block_size = i915_buddy_block_size(mm, prev); 2348c2ecf20Sopenharmony_ci offset = i915_buddy_block_offset(root); 2358c2ecf20Sopenharmony_ci 2368c2ecf20Sopenharmony_ci if (offset != (prev_offset + prev_block_size)) { 2378c2ecf20Sopenharmony_ci pr_err("root offset mismatch\n"); 2388c2ecf20Sopenharmony_ci err = -EINVAL; 2398c2ecf20Sopenharmony_ci } 2408c2ecf20Sopenharmony_ci } 2418c2ecf20Sopenharmony_ci 2428c2ecf20Sopenharmony_ci block = list_first_entry_or_null(&mm->free_list[order], 2438c2ecf20Sopenharmony_ci struct i915_buddy_block, 2448c2ecf20Sopenharmony_ci link); 2458c2ecf20Sopenharmony_ci if (block != root) { 2468c2ecf20Sopenharmony_ci pr_err("root mismatch at order=%u\n", order); 2478c2ecf20Sopenharmony_ci err = -EINVAL; 2488c2ecf20Sopenharmony_ci } 2498c2ecf20Sopenharmony_ci 2508c2ecf20Sopenharmony_ci if (err) 2518c2ecf20Sopenharmony_ci break; 2528c2ecf20Sopenharmony_ci 2538c2ecf20Sopenharmony_ci prev = root; 2548c2ecf20Sopenharmony_ci total += i915_buddy_block_size(mm, root); 2558c2ecf20Sopenharmony_ci } 2568c2ecf20Sopenharmony_ci 2578c2ecf20Sopenharmony_ci if (!err) { 2588c2ecf20Sopenharmony_ci if (total != mm->size) { 2598c2ecf20Sopenharmony_ci pr_err("expected mm size=%llx, found=%llx\n", mm->size, 2608c2ecf20Sopenharmony_ci total); 2618c2ecf20Sopenharmony_ci err = -EINVAL; 2628c2ecf20Sopenharmony_ci } 2638c2ecf20Sopenharmony_ci return err; 2648c2ecf20Sopenharmony_ci } 2658c2ecf20Sopenharmony_ci 2668c2ecf20Sopenharmony_ci if (prev) { 2678c2ecf20Sopenharmony_ci pr_err("prev root(%u), dump:\n", i - 1); 2688c2ecf20Sopenharmony_ci igt_dump_block(mm, prev); 2698c2ecf20Sopenharmony_ci } 2708c2ecf20Sopenharmony_ci 2718c2ecf20Sopenharmony_ci if (root) { 2728c2ecf20Sopenharmony_ci pr_err("bad root(%u), dump:\n", i); 2738c2ecf20Sopenharmony_ci igt_dump_block(mm, root); 2748c2ecf20Sopenharmony_ci } 2758c2ecf20Sopenharmony_ci 2768c2ecf20Sopenharmony_ci return err; 2778c2ecf20Sopenharmony_ci} 2788c2ecf20Sopenharmony_ci 2798c2ecf20Sopenharmony_cistatic void igt_mm_config(u64 *size, u64 *chunk_size) 2808c2ecf20Sopenharmony_ci{ 2818c2ecf20Sopenharmony_ci I915_RND_STATE(prng); 2828c2ecf20Sopenharmony_ci u32 s, ms; 2838c2ecf20Sopenharmony_ci 2848c2ecf20Sopenharmony_ci /* Nothing fancy, just try to get an interesting bit pattern */ 2858c2ecf20Sopenharmony_ci 2868c2ecf20Sopenharmony_ci prandom_seed_state(&prng, i915_selftest.random_seed); 2878c2ecf20Sopenharmony_ci 2888c2ecf20Sopenharmony_ci /* Let size be a random number of pages up to 8 GB (2M pages) */ 2898c2ecf20Sopenharmony_ci s = 1 + i915_prandom_u32_max_state((BIT(33 - 12)) - 1, &prng); 2908c2ecf20Sopenharmony_ci /* Let the chunk size be a random power of 2 less than size */ 2918c2ecf20Sopenharmony_ci ms = BIT(i915_prandom_u32_max_state(ilog2(s), &prng)); 2928c2ecf20Sopenharmony_ci /* Round size down to the chunk size */ 2938c2ecf20Sopenharmony_ci s &= -ms; 2948c2ecf20Sopenharmony_ci 2958c2ecf20Sopenharmony_ci /* Convert from pages to bytes */ 2968c2ecf20Sopenharmony_ci *chunk_size = (u64)ms << 12; 2978c2ecf20Sopenharmony_ci *size = (u64)s << 12; 2988c2ecf20Sopenharmony_ci} 2998c2ecf20Sopenharmony_ci 3008c2ecf20Sopenharmony_cistatic int igt_buddy_alloc_smoke(void *arg) 3018c2ecf20Sopenharmony_ci{ 3028c2ecf20Sopenharmony_ci struct i915_buddy_mm mm; 3038c2ecf20Sopenharmony_ci IGT_TIMEOUT(end_time); 3048c2ecf20Sopenharmony_ci I915_RND_STATE(prng); 3058c2ecf20Sopenharmony_ci u64 chunk_size; 3068c2ecf20Sopenharmony_ci u64 mm_size; 3078c2ecf20Sopenharmony_ci int *order; 3088c2ecf20Sopenharmony_ci int err, i; 3098c2ecf20Sopenharmony_ci 3108c2ecf20Sopenharmony_ci igt_mm_config(&mm_size, &chunk_size); 3118c2ecf20Sopenharmony_ci 3128c2ecf20Sopenharmony_ci pr_info("buddy_init with size=%llx, chunk_size=%llx\n", mm_size, chunk_size); 3138c2ecf20Sopenharmony_ci 3148c2ecf20Sopenharmony_ci err = i915_buddy_init(&mm, mm_size, chunk_size); 3158c2ecf20Sopenharmony_ci if (err) { 3168c2ecf20Sopenharmony_ci pr_err("buddy_init failed(%d)\n", err); 3178c2ecf20Sopenharmony_ci return err; 3188c2ecf20Sopenharmony_ci } 3198c2ecf20Sopenharmony_ci 3208c2ecf20Sopenharmony_ci order = i915_random_order(mm.max_order + 1, &prng); 3218c2ecf20Sopenharmony_ci if (!order) 3228c2ecf20Sopenharmony_ci goto out_fini; 3238c2ecf20Sopenharmony_ci 3248c2ecf20Sopenharmony_ci for (i = 0; i <= mm.max_order; ++i) { 3258c2ecf20Sopenharmony_ci struct i915_buddy_block *block; 3268c2ecf20Sopenharmony_ci int max_order = order[i]; 3278c2ecf20Sopenharmony_ci bool timeout = false; 3288c2ecf20Sopenharmony_ci LIST_HEAD(blocks); 3298c2ecf20Sopenharmony_ci int order; 3308c2ecf20Sopenharmony_ci u64 total; 3318c2ecf20Sopenharmony_ci 3328c2ecf20Sopenharmony_ci err = igt_check_mm(&mm); 3338c2ecf20Sopenharmony_ci if (err) { 3348c2ecf20Sopenharmony_ci pr_err("pre-mm check failed, abort\n"); 3358c2ecf20Sopenharmony_ci break; 3368c2ecf20Sopenharmony_ci } 3378c2ecf20Sopenharmony_ci 3388c2ecf20Sopenharmony_ci pr_info("filling from max_order=%u\n", max_order); 3398c2ecf20Sopenharmony_ci 3408c2ecf20Sopenharmony_ci order = max_order; 3418c2ecf20Sopenharmony_ci total = 0; 3428c2ecf20Sopenharmony_ci 3438c2ecf20Sopenharmony_ci do { 3448c2ecf20Sopenharmony_ciretry: 3458c2ecf20Sopenharmony_ci block = i915_buddy_alloc(&mm, order); 3468c2ecf20Sopenharmony_ci if (IS_ERR(block)) { 3478c2ecf20Sopenharmony_ci err = PTR_ERR(block); 3488c2ecf20Sopenharmony_ci if (err == -ENOMEM) { 3498c2ecf20Sopenharmony_ci pr_info("buddy_alloc hit -ENOMEM with order=%d\n", 3508c2ecf20Sopenharmony_ci order); 3518c2ecf20Sopenharmony_ci } else { 3528c2ecf20Sopenharmony_ci if (order--) { 3538c2ecf20Sopenharmony_ci err = 0; 3548c2ecf20Sopenharmony_ci goto retry; 3558c2ecf20Sopenharmony_ci } 3568c2ecf20Sopenharmony_ci 3578c2ecf20Sopenharmony_ci pr_err("buddy_alloc with order=%d failed(%d)\n", 3588c2ecf20Sopenharmony_ci order, err); 3598c2ecf20Sopenharmony_ci } 3608c2ecf20Sopenharmony_ci 3618c2ecf20Sopenharmony_ci break; 3628c2ecf20Sopenharmony_ci } 3638c2ecf20Sopenharmony_ci 3648c2ecf20Sopenharmony_ci list_add_tail(&block->link, &blocks); 3658c2ecf20Sopenharmony_ci 3668c2ecf20Sopenharmony_ci if (i915_buddy_block_order(block) != order) { 3678c2ecf20Sopenharmony_ci pr_err("buddy_alloc order mismatch\n"); 3688c2ecf20Sopenharmony_ci err = -EINVAL; 3698c2ecf20Sopenharmony_ci break; 3708c2ecf20Sopenharmony_ci } 3718c2ecf20Sopenharmony_ci 3728c2ecf20Sopenharmony_ci total += i915_buddy_block_size(&mm, block); 3738c2ecf20Sopenharmony_ci 3748c2ecf20Sopenharmony_ci if (__igt_timeout(end_time, NULL)) { 3758c2ecf20Sopenharmony_ci timeout = true; 3768c2ecf20Sopenharmony_ci break; 3778c2ecf20Sopenharmony_ci } 3788c2ecf20Sopenharmony_ci } while (total < mm.size); 3798c2ecf20Sopenharmony_ci 3808c2ecf20Sopenharmony_ci if (!err) 3818c2ecf20Sopenharmony_ci err = igt_check_blocks(&mm, &blocks, total, false); 3828c2ecf20Sopenharmony_ci 3838c2ecf20Sopenharmony_ci i915_buddy_free_list(&mm, &blocks); 3848c2ecf20Sopenharmony_ci 3858c2ecf20Sopenharmony_ci if (!err) { 3868c2ecf20Sopenharmony_ci err = igt_check_mm(&mm); 3878c2ecf20Sopenharmony_ci if (err) 3888c2ecf20Sopenharmony_ci pr_err("post-mm check failed\n"); 3898c2ecf20Sopenharmony_ci } 3908c2ecf20Sopenharmony_ci 3918c2ecf20Sopenharmony_ci if (err || timeout) 3928c2ecf20Sopenharmony_ci break; 3938c2ecf20Sopenharmony_ci 3948c2ecf20Sopenharmony_ci cond_resched(); 3958c2ecf20Sopenharmony_ci } 3968c2ecf20Sopenharmony_ci 3978c2ecf20Sopenharmony_ci if (err == -ENOMEM) 3988c2ecf20Sopenharmony_ci err = 0; 3998c2ecf20Sopenharmony_ci 4008c2ecf20Sopenharmony_ci kfree(order); 4018c2ecf20Sopenharmony_ciout_fini: 4028c2ecf20Sopenharmony_ci i915_buddy_fini(&mm); 4038c2ecf20Sopenharmony_ci 4048c2ecf20Sopenharmony_ci return err; 4058c2ecf20Sopenharmony_ci} 4068c2ecf20Sopenharmony_ci 4078c2ecf20Sopenharmony_cistatic int igt_buddy_alloc_pessimistic(void *arg) 4088c2ecf20Sopenharmony_ci{ 4098c2ecf20Sopenharmony_ci const unsigned int max_order = 16; 4108c2ecf20Sopenharmony_ci struct i915_buddy_block *block, *bn; 4118c2ecf20Sopenharmony_ci struct i915_buddy_mm mm; 4128c2ecf20Sopenharmony_ci unsigned int order; 4138c2ecf20Sopenharmony_ci LIST_HEAD(blocks); 4148c2ecf20Sopenharmony_ci int err; 4158c2ecf20Sopenharmony_ci 4168c2ecf20Sopenharmony_ci /* 4178c2ecf20Sopenharmony_ci * Create a pot-sized mm, then allocate one of each possible 4188c2ecf20Sopenharmony_ci * order within. This should leave the mm with exactly one 4198c2ecf20Sopenharmony_ci * page left. 4208c2ecf20Sopenharmony_ci */ 4218c2ecf20Sopenharmony_ci 4228c2ecf20Sopenharmony_ci err = i915_buddy_init(&mm, PAGE_SIZE << max_order, PAGE_SIZE); 4238c2ecf20Sopenharmony_ci if (err) { 4248c2ecf20Sopenharmony_ci pr_err("buddy_init failed(%d)\n", err); 4258c2ecf20Sopenharmony_ci return err; 4268c2ecf20Sopenharmony_ci } 4278c2ecf20Sopenharmony_ci GEM_BUG_ON(mm.max_order != max_order); 4288c2ecf20Sopenharmony_ci 4298c2ecf20Sopenharmony_ci for (order = 0; order < max_order; order++) { 4308c2ecf20Sopenharmony_ci block = i915_buddy_alloc(&mm, order); 4318c2ecf20Sopenharmony_ci if (IS_ERR(block)) { 4328c2ecf20Sopenharmony_ci pr_info("buddy_alloc hit -ENOMEM with order=%d\n", 4338c2ecf20Sopenharmony_ci order); 4348c2ecf20Sopenharmony_ci err = PTR_ERR(block); 4358c2ecf20Sopenharmony_ci goto err; 4368c2ecf20Sopenharmony_ci } 4378c2ecf20Sopenharmony_ci 4388c2ecf20Sopenharmony_ci list_add_tail(&block->link, &blocks); 4398c2ecf20Sopenharmony_ci } 4408c2ecf20Sopenharmony_ci 4418c2ecf20Sopenharmony_ci /* And now the last remaining block available */ 4428c2ecf20Sopenharmony_ci block = i915_buddy_alloc(&mm, 0); 4438c2ecf20Sopenharmony_ci if (IS_ERR(block)) { 4448c2ecf20Sopenharmony_ci pr_info("buddy_alloc hit -ENOMEM on final alloc\n"); 4458c2ecf20Sopenharmony_ci err = PTR_ERR(block); 4468c2ecf20Sopenharmony_ci goto err; 4478c2ecf20Sopenharmony_ci } 4488c2ecf20Sopenharmony_ci list_add_tail(&block->link, &blocks); 4498c2ecf20Sopenharmony_ci 4508c2ecf20Sopenharmony_ci /* Should be completely full! */ 4518c2ecf20Sopenharmony_ci for (order = max_order; order--; ) { 4528c2ecf20Sopenharmony_ci block = i915_buddy_alloc(&mm, order); 4538c2ecf20Sopenharmony_ci if (!IS_ERR(block)) { 4548c2ecf20Sopenharmony_ci pr_info("buddy_alloc unexpectedly succeeded at order %d, it should be full!", 4558c2ecf20Sopenharmony_ci order); 4568c2ecf20Sopenharmony_ci list_add_tail(&block->link, &blocks); 4578c2ecf20Sopenharmony_ci err = -EINVAL; 4588c2ecf20Sopenharmony_ci goto err; 4598c2ecf20Sopenharmony_ci } 4608c2ecf20Sopenharmony_ci } 4618c2ecf20Sopenharmony_ci 4628c2ecf20Sopenharmony_ci block = list_last_entry(&blocks, typeof(*block), link); 4638c2ecf20Sopenharmony_ci list_del(&block->link); 4648c2ecf20Sopenharmony_ci i915_buddy_free(&mm, block); 4658c2ecf20Sopenharmony_ci 4668c2ecf20Sopenharmony_ci /* As we free in increasing size, we make available larger blocks */ 4678c2ecf20Sopenharmony_ci order = 1; 4688c2ecf20Sopenharmony_ci list_for_each_entry_safe(block, bn, &blocks, link) { 4698c2ecf20Sopenharmony_ci list_del(&block->link); 4708c2ecf20Sopenharmony_ci i915_buddy_free(&mm, block); 4718c2ecf20Sopenharmony_ci 4728c2ecf20Sopenharmony_ci block = i915_buddy_alloc(&mm, order); 4738c2ecf20Sopenharmony_ci if (IS_ERR(block)) { 4748c2ecf20Sopenharmony_ci pr_info("buddy_alloc (realloc) hit -ENOMEM with order=%d\n", 4758c2ecf20Sopenharmony_ci order); 4768c2ecf20Sopenharmony_ci err = PTR_ERR(block); 4778c2ecf20Sopenharmony_ci goto err; 4788c2ecf20Sopenharmony_ci } 4798c2ecf20Sopenharmony_ci i915_buddy_free(&mm, block); 4808c2ecf20Sopenharmony_ci order++; 4818c2ecf20Sopenharmony_ci } 4828c2ecf20Sopenharmony_ci 4838c2ecf20Sopenharmony_ci /* To confirm, now the whole mm should be available */ 4848c2ecf20Sopenharmony_ci block = i915_buddy_alloc(&mm, max_order); 4858c2ecf20Sopenharmony_ci if (IS_ERR(block)) { 4868c2ecf20Sopenharmony_ci pr_info("buddy_alloc (realloc) hit -ENOMEM with order=%d\n", 4878c2ecf20Sopenharmony_ci max_order); 4888c2ecf20Sopenharmony_ci err = PTR_ERR(block); 4898c2ecf20Sopenharmony_ci goto err; 4908c2ecf20Sopenharmony_ci } 4918c2ecf20Sopenharmony_ci i915_buddy_free(&mm, block); 4928c2ecf20Sopenharmony_ci 4938c2ecf20Sopenharmony_cierr: 4948c2ecf20Sopenharmony_ci i915_buddy_free_list(&mm, &blocks); 4958c2ecf20Sopenharmony_ci i915_buddy_fini(&mm); 4968c2ecf20Sopenharmony_ci return err; 4978c2ecf20Sopenharmony_ci} 4988c2ecf20Sopenharmony_ci 4998c2ecf20Sopenharmony_cistatic int igt_buddy_alloc_optimistic(void *arg) 5008c2ecf20Sopenharmony_ci{ 5018c2ecf20Sopenharmony_ci const int max_order = 16; 5028c2ecf20Sopenharmony_ci struct i915_buddy_block *block; 5038c2ecf20Sopenharmony_ci struct i915_buddy_mm mm; 5048c2ecf20Sopenharmony_ci LIST_HEAD(blocks); 5058c2ecf20Sopenharmony_ci int order; 5068c2ecf20Sopenharmony_ci int err; 5078c2ecf20Sopenharmony_ci 5088c2ecf20Sopenharmony_ci /* 5098c2ecf20Sopenharmony_ci * Create a mm with one block of each order available, and 5108c2ecf20Sopenharmony_ci * try to allocate them all. 5118c2ecf20Sopenharmony_ci */ 5128c2ecf20Sopenharmony_ci 5138c2ecf20Sopenharmony_ci err = i915_buddy_init(&mm, 5148c2ecf20Sopenharmony_ci PAGE_SIZE * ((1 << (max_order + 1)) - 1), 5158c2ecf20Sopenharmony_ci PAGE_SIZE); 5168c2ecf20Sopenharmony_ci if (err) { 5178c2ecf20Sopenharmony_ci pr_err("buddy_init failed(%d)\n", err); 5188c2ecf20Sopenharmony_ci return err; 5198c2ecf20Sopenharmony_ci } 5208c2ecf20Sopenharmony_ci GEM_BUG_ON(mm.max_order != max_order); 5218c2ecf20Sopenharmony_ci 5228c2ecf20Sopenharmony_ci for (order = 0; order <= max_order; order++) { 5238c2ecf20Sopenharmony_ci block = i915_buddy_alloc(&mm, order); 5248c2ecf20Sopenharmony_ci if (IS_ERR(block)) { 5258c2ecf20Sopenharmony_ci pr_info("buddy_alloc hit -ENOMEM with order=%d\n", 5268c2ecf20Sopenharmony_ci order); 5278c2ecf20Sopenharmony_ci err = PTR_ERR(block); 5288c2ecf20Sopenharmony_ci goto err; 5298c2ecf20Sopenharmony_ci } 5308c2ecf20Sopenharmony_ci 5318c2ecf20Sopenharmony_ci list_add_tail(&block->link, &blocks); 5328c2ecf20Sopenharmony_ci } 5338c2ecf20Sopenharmony_ci 5348c2ecf20Sopenharmony_ci /* Should be completely full! */ 5358c2ecf20Sopenharmony_ci block = i915_buddy_alloc(&mm, 0); 5368c2ecf20Sopenharmony_ci if (!IS_ERR(block)) { 5378c2ecf20Sopenharmony_ci pr_info("buddy_alloc unexpectedly succeeded, it should be full!"); 5388c2ecf20Sopenharmony_ci list_add_tail(&block->link, &blocks); 5398c2ecf20Sopenharmony_ci err = -EINVAL; 5408c2ecf20Sopenharmony_ci goto err; 5418c2ecf20Sopenharmony_ci } 5428c2ecf20Sopenharmony_ci 5438c2ecf20Sopenharmony_cierr: 5448c2ecf20Sopenharmony_ci i915_buddy_free_list(&mm, &blocks); 5458c2ecf20Sopenharmony_ci i915_buddy_fini(&mm); 5468c2ecf20Sopenharmony_ci return err; 5478c2ecf20Sopenharmony_ci} 5488c2ecf20Sopenharmony_ci 5498c2ecf20Sopenharmony_cistatic int igt_buddy_alloc_pathological(void *arg) 5508c2ecf20Sopenharmony_ci{ 5518c2ecf20Sopenharmony_ci const int max_order = 16; 5528c2ecf20Sopenharmony_ci struct i915_buddy_block *block; 5538c2ecf20Sopenharmony_ci struct i915_buddy_mm mm; 5548c2ecf20Sopenharmony_ci LIST_HEAD(blocks); 5558c2ecf20Sopenharmony_ci LIST_HEAD(holes); 5568c2ecf20Sopenharmony_ci int order, top; 5578c2ecf20Sopenharmony_ci int err; 5588c2ecf20Sopenharmony_ci 5598c2ecf20Sopenharmony_ci /* 5608c2ecf20Sopenharmony_ci * Create a pot-sized mm, then allocate one of each possible 5618c2ecf20Sopenharmony_ci * order within. This should leave the mm with exactly one 5628c2ecf20Sopenharmony_ci * page left. Free the largest block, then whittle down again. 5638c2ecf20Sopenharmony_ci * Eventually we will have a fully 50% fragmented mm. 5648c2ecf20Sopenharmony_ci */ 5658c2ecf20Sopenharmony_ci 5668c2ecf20Sopenharmony_ci err = i915_buddy_init(&mm, PAGE_SIZE << max_order, PAGE_SIZE); 5678c2ecf20Sopenharmony_ci if (err) { 5688c2ecf20Sopenharmony_ci pr_err("buddy_init failed(%d)\n", err); 5698c2ecf20Sopenharmony_ci return err; 5708c2ecf20Sopenharmony_ci } 5718c2ecf20Sopenharmony_ci GEM_BUG_ON(mm.max_order != max_order); 5728c2ecf20Sopenharmony_ci 5738c2ecf20Sopenharmony_ci for (top = max_order; top; top--) { 5748c2ecf20Sopenharmony_ci /* Make room by freeing the largest allocated block */ 5758c2ecf20Sopenharmony_ci block = list_first_entry_or_null(&blocks, typeof(*block), link); 5768c2ecf20Sopenharmony_ci if (block) { 5778c2ecf20Sopenharmony_ci list_del(&block->link); 5788c2ecf20Sopenharmony_ci i915_buddy_free(&mm, block); 5798c2ecf20Sopenharmony_ci } 5808c2ecf20Sopenharmony_ci 5818c2ecf20Sopenharmony_ci for (order = top; order--; ) { 5828c2ecf20Sopenharmony_ci block = i915_buddy_alloc(&mm, order); 5838c2ecf20Sopenharmony_ci if (IS_ERR(block)) { 5848c2ecf20Sopenharmony_ci pr_info("buddy_alloc hit -ENOMEM with order=%d, top=%d\n", 5858c2ecf20Sopenharmony_ci order, top); 5868c2ecf20Sopenharmony_ci err = PTR_ERR(block); 5878c2ecf20Sopenharmony_ci goto err; 5888c2ecf20Sopenharmony_ci } 5898c2ecf20Sopenharmony_ci list_add_tail(&block->link, &blocks); 5908c2ecf20Sopenharmony_ci } 5918c2ecf20Sopenharmony_ci 5928c2ecf20Sopenharmony_ci /* There should be one final page for this sub-allocation */ 5938c2ecf20Sopenharmony_ci block = i915_buddy_alloc(&mm, 0); 5948c2ecf20Sopenharmony_ci if (IS_ERR(block)) { 5958c2ecf20Sopenharmony_ci pr_info("buddy_alloc hit -ENOMEM for hole\n"); 5968c2ecf20Sopenharmony_ci err = PTR_ERR(block); 5978c2ecf20Sopenharmony_ci goto err; 5988c2ecf20Sopenharmony_ci } 5998c2ecf20Sopenharmony_ci list_add_tail(&block->link, &holes); 6008c2ecf20Sopenharmony_ci 6018c2ecf20Sopenharmony_ci block = i915_buddy_alloc(&mm, top); 6028c2ecf20Sopenharmony_ci if (!IS_ERR(block)) { 6038c2ecf20Sopenharmony_ci pr_info("buddy_alloc unexpectedly succeeded at top-order %d/%d, it should be full!", 6048c2ecf20Sopenharmony_ci top, max_order); 6058c2ecf20Sopenharmony_ci list_add_tail(&block->link, &blocks); 6068c2ecf20Sopenharmony_ci err = -EINVAL; 6078c2ecf20Sopenharmony_ci goto err; 6088c2ecf20Sopenharmony_ci } 6098c2ecf20Sopenharmony_ci } 6108c2ecf20Sopenharmony_ci 6118c2ecf20Sopenharmony_ci i915_buddy_free_list(&mm, &holes); 6128c2ecf20Sopenharmony_ci 6138c2ecf20Sopenharmony_ci /* Nothing larger than blocks of chunk_size now available */ 6148c2ecf20Sopenharmony_ci for (order = 1; order <= max_order; order++) { 6158c2ecf20Sopenharmony_ci block = i915_buddy_alloc(&mm, order); 6168c2ecf20Sopenharmony_ci if (!IS_ERR(block)) { 6178c2ecf20Sopenharmony_ci pr_info("buddy_alloc unexpectedly succeeded at order %d, it should be full!", 6188c2ecf20Sopenharmony_ci order); 6198c2ecf20Sopenharmony_ci list_add_tail(&block->link, &blocks); 6208c2ecf20Sopenharmony_ci err = -EINVAL; 6218c2ecf20Sopenharmony_ci goto err; 6228c2ecf20Sopenharmony_ci } 6238c2ecf20Sopenharmony_ci } 6248c2ecf20Sopenharmony_ci 6258c2ecf20Sopenharmony_cierr: 6268c2ecf20Sopenharmony_ci list_splice_tail(&holes, &blocks); 6278c2ecf20Sopenharmony_ci i915_buddy_free_list(&mm, &blocks); 6288c2ecf20Sopenharmony_ci i915_buddy_fini(&mm); 6298c2ecf20Sopenharmony_ci return err; 6308c2ecf20Sopenharmony_ci} 6318c2ecf20Sopenharmony_ci 6328c2ecf20Sopenharmony_cistatic int igt_buddy_alloc_range(void *arg) 6338c2ecf20Sopenharmony_ci{ 6348c2ecf20Sopenharmony_ci struct i915_buddy_mm mm; 6358c2ecf20Sopenharmony_ci unsigned long page_num; 6368c2ecf20Sopenharmony_ci LIST_HEAD(blocks); 6378c2ecf20Sopenharmony_ci u64 chunk_size; 6388c2ecf20Sopenharmony_ci u64 offset; 6398c2ecf20Sopenharmony_ci u64 size; 6408c2ecf20Sopenharmony_ci u64 rem; 6418c2ecf20Sopenharmony_ci int err; 6428c2ecf20Sopenharmony_ci 6438c2ecf20Sopenharmony_ci igt_mm_config(&size, &chunk_size); 6448c2ecf20Sopenharmony_ci 6458c2ecf20Sopenharmony_ci pr_info("buddy_init with size=%llx, chunk_size=%llx\n", size, chunk_size); 6468c2ecf20Sopenharmony_ci 6478c2ecf20Sopenharmony_ci err = i915_buddy_init(&mm, size, chunk_size); 6488c2ecf20Sopenharmony_ci if (err) { 6498c2ecf20Sopenharmony_ci pr_err("buddy_init failed(%d)\n", err); 6508c2ecf20Sopenharmony_ci return err; 6518c2ecf20Sopenharmony_ci } 6528c2ecf20Sopenharmony_ci 6538c2ecf20Sopenharmony_ci err = igt_check_mm(&mm); 6548c2ecf20Sopenharmony_ci if (err) { 6558c2ecf20Sopenharmony_ci pr_err("pre-mm check failed, abort, abort, abort!\n"); 6568c2ecf20Sopenharmony_ci goto err_fini; 6578c2ecf20Sopenharmony_ci } 6588c2ecf20Sopenharmony_ci 6598c2ecf20Sopenharmony_ci rem = mm.size; 6608c2ecf20Sopenharmony_ci offset = 0; 6618c2ecf20Sopenharmony_ci 6628c2ecf20Sopenharmony_ci for_each_prime_number_from(page_num, 1, ULONG_MAX - 1) { 6638c2ecf20Sopenharmony_ci struct i915_buddy_block *block; 6648c2ecf20Sopenharmony_ci LIST_HEAD(tmp); 6658c2ecf20Sopenharmony_ci 6668c2ecf20Sopenharmony_ci size = min(page_num * mm.chunk_size, rem); 6678c2ecf20Sopenharmony_ci 6688c2ecf20Sopenharmony_ci err = i915_buddy_alloc_range(&mm, &tmp, offset, size); 6698c2ecf20Sopenharmony_ci if (err) { 6708c2ecf20Sopenharmony_ci if (err == -ENOMEM) { 6718c2ecf20Sopenharmony_ci pr_info("alloc_range hit -ENOMEM with size=%llx\n", 6728c2ecf20Sopenharmony_ci size); 6738c2ecf20Sopenharmony_ci } else { 6748c2ecf20Sopenharmony_ci pr_err("alloc_range with offset=%llx, size=%llx failed(%d)\n", 6758c2ecf20Sopenharmony_ci offset, size, err); 6768c2ecf20Sopenharmony_ci } 6778c2ecf20Sopenharmony_ci 6788c2ecf20Sopenharmony_ci break; 6798c2ecf20Sopenharmony_ci } 6808c2ecf20Sopenharmony_ci 6818c2ecf20Sopenharmony_ci block = list_first_entry_or_null(&tmp, 6828c2ecf20Sopenharmony_ci struct i915_buddy_block, 6838c2ecf20Sopenharmony_ci link); 6848c2ecf20Sopenharmony_ci if (!block) { 6858c2ecf20Sopenharmony_ci pr_err("alloc_range has no blocks\n"); 6868c2ecf20Sopenharmony_ci err = -EINVAL; 6878c2ecf20Sopenharmony_ci break; 6888c2ecf20Sopenharmony_ci } 6898c2ecf20Sopenharmony_ci 6908c2ecf20Sopenharmony_ci if (i915_buddy_block_offset(block) != offset) { 6918c2ecf20Sopenharmony_ci pr_err("alloc_range start offset mismatch, found=%llx, expected=%llx\n", 6928c2ecf20Sopenharmony_ci i915_buddy_block_offset(block), offset); 6938c2ecf20Sopenharmony_ci err = -EINVAL; 6948c2ecf20Sopenharmony_ci } 6958c2ecf20Sopenharmony_ci 6968c2ecf20Sopenharmony_ci if (!err) 6978c2ecf20Sopenharmony_ci err = igt_check_blocks(&mm, &tmp, size, true); 6988c2ecf20Sopenharmony_ci 6998c2ecf20Sopenharmony_ci list_splice_tail(&tmp, &blocks); 7008c2ecf20Sopenharmony_ci 7018c2ecf20Sopenharmony_ci if (err) 7028c2ecf20Sopenharmony_ci break; 7038c2ecf20Sopenharmony_ci 7048c2ecf20Sopenharmony_ci offset += size; 7058c2ecf20Sopenharmony_ci 7068c2ecf20Sopenharmony_ci rem -= size; 7078c2ecf20Sopenharmony_ci if (!rem) 7088c2ecf20Sopenharmony_ci break; 7098c2ecf20Sopenharmony_ci 7108c2ecf20Sopenharmony_ci cond_resched(); 7118c2ecf20Sopenharmony_ci } 7128c2ecf20Sopenharmony_ci 7138c2ecf20Sopenharmony_ci if (err == -ENOMEM) 7148c2ecf20Sopenharmony_ci err = 0; 7158c2ecf20Sopenharmony_ci 7168c2ecf20Sopenharmony_ci i915_buddy_free_list(&mm, &blocks); 7178c2ecf20Sopenharmony_ci 7188c2ecf20Sopenharmony_ci if (!err) { 7198c2ecf20Sopenharmony_ci err = igt_check_mm(&mm); 7208c2ecf20Sopenharmony_ci if (err) 7218c2ecf20Sopenharmony_ci pr_err("post-mm check failed\n"); 7228c2ecf20Sopenharmony_ci } 7238c2ecf20Sopenharmony_ci 7248c2ecf20Sopenharmony_cierr_fini: 7258c2ecf20Sopenharmony_ci i915_buddy_fini(&mm); 7268c2ecf20Sopenharmony_ci 7278c2ecf20Sopenharmony_ci return err; 7288c2ecf20Sopenharmony_ci} 7298c2ecf20Sopenharmony_ci 7308c2ecf20Sopenharmony_ciint i915_buddy_mock_selftests(void) 7318c2ecf20Sopenharmony_ci{ 7328c2ecf20Sopenharmony_ci static const struct i915_subtest tests[] = { 7338c2ecf20Sopenharmony_ci SUBTEST(igt_buddy_alloc_pessimistic), 7348c2ecf20Sopenharmony_ci SUBTEST(igt_buddy_alloc_optimistic), 7358c2ecf20Sopenharmony_ci SUBTEST(igt_buddy_alloc_pathological), 7368c2ecf20Sopenharmony_ci SUBTEST(igt_buddy_alloc_smoke), 7378c2ecf20Sopenharmony_ci SUBTEST(igt_buddy_alloc_range), 7388c2ecf20Sopenharmony_ci }; 7398c2ecf20Sopenharmony_ci 7408c2ecf20Sopenharmony_ci return i915_subtests(tests, NULL); 7418c2ecf20Sopenharmony_ci} 742