mirror of
https://github.com/torvalds/linux.git
synced 2026-09-22 04:34:03 +02:00
drm/gpu: Add gpu_buddy_allocated_addr_to_block helper
Add helper with primary purpose is to efficiently trace a specific physical memory address back to its corresponding TTM buffer object. v3: - use mm->chunk_size minimum allocation granularity (Arun) v2: - %s/gpu_buddy_addr_to_block/gpu_buddy_allocated_addr_to_block(MattA) - remove clear->avail and split nodes check(MattA) - Adapt lockdep(MattB) Signed-off-by: Tejas Upadhyay <tejas.upadhyay@intel.com> Cc: Arunpravin Paneer Selvam <arunpravin.paneerselvam@amd.com> Cc: dri-devel@lists.freedesktop.org Reviewed-by: Arunpravin Paneer Selvam <Arunpravin.PaneerSelvam@amd.com> Signed-off-by: Arunpravin Paneer Selvam <Arunpravin.PaneerSelvam@amd.com> Link: https://patch.msgid.link/20260806053624.3215216-5-tejas.upadhyay@intel.com
This commit is contained in:
parent
0ba6deddaa
commit
151ebbc20a
|
|
@ -630,6 +630,59 @@ void gpu_buddy_free_block(struct gpu_buddy *mm,
|
|||
}
|
||||
EXPORT_SYMBOL(gpu_buddy_free_block);
|
||||
|
||||
/**
|
||||
* gpu_buddy_allocated_addr_to_block - given relative address find the allocated block
|
||||
*
|
||||
* @mm: GPU buddy manager
|
||||
* @addr: Relative address
|
||||
*
|
||||
* Returns:
|
||||
* gpu_buddy_block on success, NULL or error code on failure
|
||||
*/
|
||||
struct gpu_buddy_block *gpu_buddy_allocated_addr_to_block(struct gpu_buddy *mm, u64 addr)
|
||||
{
|
||||
struct gpu_buddy_block *block;
|
||||
LIST_HEAD(dfs);
|
||||
u64 end;
|
||||
int i;
|
||||
|
||||
gpu_buddy_driver_lock_held(mm);
|
||||
|
||||
end = addr + mm->chunk_size - 1;
|
||||
for (i = 0; i < mm->n_roots; ++i)
|
||||
list_add_tail(&mm->roots[i]->tmp_link, &dfs);
|
||||
|
||||
do {
|
||||
u64 block_start;
|
||||
u64 block_end;
|
||||
|
||||
block = list_first_entry_or_null(&dfs,
|
||||
struct gpu_buddy_block,
|
||||
tmp_link);
|
||||
if (!block)
|
||||
break;
|
||||
|
||||
list_del(&block->tmp_link);
|
||||
|
||||
block_start = gpu_buddy_block_offset(block);
|
||||
block_end = block_start + gpu_buddy_block_size(mm, block) - 1;
|
||||
|
||||
if (!overlaps(addr, end, block_start, block_end))
|
||||
continue;
|
||||
|
||||
if (gpu_buddy_block_is_allocated(block))
|
||||
return block;
|
||||
else if (gpu_buddy_block_is_free(block))
|
||||
return NULL;
|
||||
|
||||
list_add(&block->right->tmp_link, &dfs);
|
||||
list_add(&block->left->tmp_link, &dfs);
|
||||
} while (1);
|
||||
|
||||
return ERR_PTR(-ENXIO);
|
||||
}
|
||||
EXPORT_SYMBOL(gpu_buddy_allocated_addr_to_block);
|
||||
|
||||
static void __gpu_buddy_free_list(struct gpu_buddy *mm,
|
||||
struct list_head *objects,
|
||||
bool mark_clear,
|
||||
|
|
|
|||
|
|
@ -287,6 +287,8 @@ void gpu_buddy_reset_clear(struct gpu_buddy *mm, bool is_clear);
|
|||
|
||||
void gpu_buddy_free_block(struct gpu_buddy *mm, struct gpu_buddy_block *block);
|
||||
|
||||
struct gpu_buddy_block *gpu_buddy_allocated_addr_to_block(struct gpu_buddy *mm, u64 addr);
|
||||
|
||||
void gpu_buddy_free_list(struct gpu_buddy *mm,
|
||||
struct list_head *objects,
|
||||
unsigned int flags);
|
||||
|
|
|
|||
Loading…
Reference in New Issue
Block a user