From: Honglei Huang <honghuan@amd.com>
Add necessary data structures to support tracking multiple user
address ranges within a single memory object.
The user_range_info structure tracks individual ranges with their
own HMM ranges and MMU notifiers, allowing per-range invalidation
tracking. The kgd_mem structure is extended to hold an array of
these ranges.
Signed-off-by: Honglei Huang <honghuan@amd.com>
---
drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd.h | 21 +++++++++++++++++++++
1 file changed, 21 insertions(+)
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd.h b/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd.h
index 321cbf9a1..1883833a2 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;
};
+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; /* Invalidation counter */
+ struct mmu_interval_notifier notifier; /* MMU notifier for this range */
+ struct kgd_mem *mem; /* Back pointer to parent kgd_mem */
+};
+
struct kgd_mem {
struct mutex lock;
struct amdgpu_bo *bo;
@@ -89,6 +99,12 @@ struct kgd_mem {
uint32_t gem_handle;
bool aql_queue;
bool is_imported;
+
+ /* For batch userptr allocation: multiple non-contiguous CPU VA ranges
+ * mapped to a single contiguous GPU VA range
+ */
+ uint32_t num_user_ranges;
+ struct user_range_info *user_ranges;
};
/* KFD Memory Eviction */
@@ -313,6 +329,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