drm_buddy_print() currently reports per-order free block counts by
walking all rbtrees, which is O(n) in the total number of free blocks
and holds the allocator lock for the duration. On large VRAM heaps with
many small fragments this becomes expensive.
This series replaces the rbtree walk with two lightweight scoreboard
arrays — free_scoreboard and used_scoreboard — indexed by order and
maintained incrementally at the points where block state transitions
occur. The print functions become simple array lookups, and drivers
reading debugfs (/sys/kernel/debug/dri/0/tile0/vram_mm) now get both
free and used counts per order at O(1) cost.
v3: Add __gpu_buddy_undo_splits() helper as suggested by Matt
v2: Add first patch to fix bug reported by Sashiko [1] then update
following patches accordingly
Francois Dugast (5):
gpu/buddy: Fix use-after-free in split_block() call sites
gpu/buddy: Remove redundant condition in alloc_from_freetree() error
path
gpu/buddy: Introduce __gpu_buddy_undo_splits() helper
gpu/buddy: Track per-order free blocks with a scoreboard
gpu/buddy: Track per-order used blocks with a scoreboard
drivers/gpu/buddy.c | 104 ++++++++++++++++++++++--------------
drivers/gpu/drm/drm_buddy.c | 30 +++++------
include/linux/gpu_buddy.h | 15 ++++++
3 files changed, 90 insertions(+), 59 deletions(-)
--
2.43.0