From: Honglei Huang <[email protected]> Add data structures to support batch userptr allocations with multiple non-contiguous CPU virtual address ranges.
add: - struct user_range_info: per-range metadata including HMM range, invalidation counter, and interval tree node - Fields to kgd_mem: num_user_ranges, user_ranges array, batch_va_min/max, batch_notifier, and user_ranges_itree Signed-off-by: Honglei Huang <[email protected]> --- drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd.h | 23 ++++++++++++++++++++++ 1 file changed, 23 insertions(+) diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd.h b/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd.h index 321cbf9a1..58917a4b3 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd.h +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd.h @@ -48,6 +48,7 @@ enum TLB_FLUSH_TYPE { struct amdgpu_device; struct kfd_process_device; +struct kfd_ioctl_userptr_range; struct amdgpu_reset_context; enum kfd_mem_attachment_type { @@ -67,6 +68,15 @@ struct kfd_mem_attachment { uint64_t pte_flags; }; +/* Individual range info for batch userptr allocations */ +struct user_range_info { + uint64_t start; /* CPU virtual address start */ + uint64_t size; /* Size in bytes */ + struct hmm_range *range; /* HMM range for this userptr */ + uint32_t invalid; /* Per-range invalidation counter */ + struct interval_tree_node it_node; /* Interval tree node for fast overlap lookup */ +}; + struct kgd_mem { struct mutex lock; struct amdgpu_bo *bo; @@ -89,6 +99,14 @@ struct kgd_mem { uint32_t gem_handle; bool aql_queue; bool is_imported; + + /* For batch userptr allocation: multiple non-contiguous CPU VA ranges */ + uint32_t num_user_ranges; + struct user_range_info *user_ranges; + uint64_t batch_va_min; + uint64_t batch_va_max; + struct mmu_interval_notifier batch_notifier; + struct rb_root_cached user_ranges_itree; }; /* KFD Memory Eviction */ @@ -313,6 +331,11 @@ int amdgpu_amdkfd_gpuvm_alloc_memory_of_gpu( struct amdgpu_device *adev, uint64_t va, uint64_t size, void *drm_priv, struct kgd_mem **mem, uint64_t *offset, uint32_t flags, bool criu_resume); +int amdgpu_amdkfd_gpuvm_alloc_memory_of_gpu_batch( + struct amdgpu_device *adev, uint64_t va, uint64_t size, + void *drm_priv, struct kgd_mem **mem, + uint64_t *offset, struct kfd_ioctl_userptr_range *ranges, + uint32_t num_ranges, uint32_t flags, bool criu_resume); int amdgpu_amdkfd_gpuvm_free_memory_of_gpu( struct amdgpu_device *adev, struct kgd_mem *mem, void *drm_priv, uint64_t *size); -- 2.34.1
