To implement the ability to see allocated blocks under a specific VRAM instance in the drm driver, new api is introduced. While existing structs often show the free block list, this addition provides a comprehensive view of all currently resident VRAM allocations.
Dump will look like, [ +0.000003] xe 0000:03:00.0: [drm] 0x00000002f8000000-0x00000002f8800000: 8388608 [ +0.000005] xe 0000:03:00.0: [drm] 0x00000002f8800000-0x00000002f8840000: 262144 [ +0.000004] xe 0000:03:00.0: [drm] 0x00000002f8840000-0x00000002f8860000: 131072 [ +0.000004] xe 0000:03:00.0: [drm] 0x00000002f8860000-0x00000002f8870000: 65536 [ +0.000005] xe 0000:03:00.0: [drm] 0x00000002f9000000-0x00000002f9800000: 8388608 [ +0.000004] xe 0000:03:00.0: [drm] 0x00000002f9800000-0x00000002f9880000: 524288 [ +0.000005] xe 0000:03:00.0: [drm] 0x00000002f9880000-0x00000002f9884000: 16384 [ +0.000004] xe 0000:03:00.0: [drm] 0x00000002f9900000-0x00000002f9980000: 524288 [ +0.000005] xe 0000:03:00.0: [drm] 0x00000002f9980000-0x00000002f9988000: 32768 [ +0.000004] xe 0000:03:00.0: [drm] 0x00000002f9988000-0x00000002f998c000: 16384 v2(MattB): - Add lockdep assert Signed-off-by: Tejas Upadhyay <[email protected]> Cc: Arunpravin Paneer Selvam <[email protected]> Cc: [email protected] --- drivers/gpu/buddy.c | 43 +++++++++++++++++++++++++++++++++++++++ include/linux/gpu_buddy.h | 1 + 2 files changed, 44 insertions(+) diff --git a/drivers/gpu/buddy.c b/drivers/gpu/buddy.c index 9de9872294a6..fcea0d96d8cf 100644 --- a/drivers/gpu/buddy.c +++ b/drivers/gpu/buddy.c @@ -10,6 +10,7 @@ #include <linux/sizes.h> #include <linux/gpu_buddy.h> +#include <drm/drm_print.h> /** * gpu_buddy_assert - assert a condition in the buddy allocator @@ -1294,6 +1295,48 @@ int gpu_buddy_block_trim(struct gpu_buddy *mm, } EXPORT_SYMBOL(gpu_buddy_block_trim); +/** + * gpu_buddy_dump_allocated_blocks - print all allocated blocks in drm buddy + * + * @mm: DRM buddy manager to look into + * + * Looks into buddy manager for each block and their status and if allocated + * print allocated block range and size + * + * Returns: + * void + */ +void gpu_buddy_dump_allocated_blocks(struct gpu_buddy *mm) +{ + struct gpu_buddy_block *block; + LIST_HEAD(dfs); + int i; + + gpu_buddy_driver_lock_held(mm); + + for (i = 0; i < mm->n_roots; ++i) + list_add_tail(&mm->roots[i]->tmp_link, &dfs); + + do { + block = list_first_entry_or_null(&dfs, + struct gpu_buddy_block, + tmp_link); + if (!block) + break; + + list_del(&block->tmp_link); + + if (gpu_buddy_block_is_allocated(block)) + gpu_buddy_block_print(mm, block); + + if (gpu_buddy_block_is_split(block)) { + list_add(&block->right->tmp_link, &dfs); + list_add(&block->left->tmp_link, &dfs); + } + } while (1); +} +EXPORT_SYMBOL(gpu_buddy_dump_allocated_blocks); + static struct gpu_buddy_block * __gpu_buddy_alloc_blocks(struct gpu_buddy *mm, u64 start, u64 end, diff --git a/include/linux/gpu_buddy.h b/include/linux/gpu_buddy.h index e7e22fa05ee2..aaebdceb1c44 100644 --- a/include/linux/gpu_buddy.h +++ b/include/linux/gpu_buddy.h @@ -267,6 +267,7 @@ int gpu_buddy_block_trim(struct gpu_buddy *mm, u64 *start, u64 new_size, struct list_head *blocks); +void gpu_buddy_dump_allocated_blocks(struct gpu_buddy *mm); void gpu_buddy_reset_clear(struct gpu_buddy *mm, bool is_clear); -- 2.52.0
