drivers/gpu/tests/gpu_buddy_test.c

Source file repositories/reference/linux-study-clean/drivers/gpu/tests/gpu_buddy_test.c

File Facts

System
Linux kernel
Corpus path
drivers/gpu/tests/gpu_buddy_test.c
Extension
.c
Size
45745 bytes
Lines
1422
Domain
Driver Families
Bucket
drivers/gpu
Inferred role
Driver Families: implementation source
Status
source implementation candidate

Why This File Exists

Repeatable hardware-adapter layer. Deep compatibility for every driver is out of scope; this atlas records patterns, probe lifecycles, bus glue, IRQ/DMA usage, and links back to core abstractions.

Dependency Surface

Detected Declarations

Annotated Snippet

if (node) {
					root = container_of(node,
							    struct gpu_buddy_block,
							    rb);
					break;
				}
			}
		}

		KUNIT_ASSERT_NOT_NULL(test, root);
		KUNIT_EXPECT_EQ(test, root->subtree_max_alignment, expected);
	}

	for (i = ARRAY_SIZE(alignments); i-- > 0; ) {
		gpu_buddy_free_list(&mm, &allocated[i], 0);

		for (order = 0; order <= mm.max_order; order++) {
			for (tree = 0; tree < 2; tree++) {
				node = mm.free_trees[tree][order].rb_node;
				if (!node)
					continue;

				block = container_of(node, struct gpu_buddy_block, rb);
				max_subtree_align = max(max_subtree_align,
							block->subtree_max_alignment);
			}
		}

		KUNIT_EXPECT_GE(test, max_subtree_align, ilog2(alignments[i]));
	}

	gpu_buddy_fini(&mm);
}

static void gpu_test_buddy_offset_aligned_allocation(struct kunit *test)
{
	struct gpu_buddy_block *block, *tmp;
	int num_blocks, i, count = 0;
	LIST_HEAD(allocated);
	struct gpu_buddy mm;
	u64 mm_size = SZ_4M;
	LIST_HEAD(freed);

	KUNIT_ASSERT_FALSE_MSG(test, gpu_buddy_init(&mm, mm_size, SZ_4K),
			       "buddy_init failed\n");

	num_blocks = mm_size / SZ_256K;
	/*
	 * Allocate multiple sizes under a fixed offset alignment.
	 * Ensures alignment handling is independent of allocation size and
	 * exercises subtree max-alignment pruning for small requests.
	 */
	for (i = 0; i < num_blocks; i++)
		KUNIT_ASSERT_FALSE_MSG(test, gpu_buddy_alloc_blocks(&mm, 0, mm_size, SZ_8K, SZ_256K,
								    &allocated, 0),
					"buddy_alloc hit an error size=%u\n", SZ_8K);

	list_for_each_entry(block, &allocated, link) {
		/* Ensure the allocated block uses the expected 8 KB size */
		KUNIT_EXPECT_EQ(test, gpu_buddy_block_size(&mm, block), SZ_8K);
		/* Ensure the block starts at a 256 KB-aligned offset for proper alignment */
		KUNIT_EXPECT_TRUE(test, IS_ALIGNED(gpu_buddy_block_offset(block), SZ_256K));
	}
	gpu_buddy_free_list(&mm, &allocated, 0);

	for (i = 0; i < num_blocks; i++)
		KUNIT_ASSERT_FALSE_MSG(test, gpu_buddy_alloc_blocks(&mm, 0, mm_size, SZ_16K, SZ_256K,
								    &allocated, 0),
					"buddy_alloc hit an error size=%u\n", SZ_16K);

	list_for_each_entry(block, &allocated, link) {
		/* Ensure the allocated block uses the expected 16 KB size */
		KUNIT_EXPECT_EQ(test, gpu_buddy_block_size(&mm, block), SZ_16K);
		/* Ensure the block starts at a 256 KB-aligned offset for proper alignment */
		KUNIT_EXPECT_TRUE(test, IS_ALIGNED(gpu_buddy_block_offset(block), SZ_256K));
	}

	/*
	 * Free alternating aligned blocks to introduce fragmentation.
	 * Ensures offset-aligned allocations remain valid after frees and
	 * verifies subtree max-alignment metadata is correctly maintained.
	 */
	list_for_each_entry_safe(block, tmp, &allocated, link) {
		if (count % 2 == 0)
			list_move_tail(&block->link, &freed);
		count++;
	}
	gpu_buddy_free_list(&mm, &freed, 0);

	for (i = 0; i < num_blocks / 2; i++)

Annotation

Implementation Notes