]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
drm/gpusvm: Introduce drm_gpusvm_find_vma_start() function
authorHimal Prasad Ghimiray <himal.prasad.ghimiray@intel.com>
Tue, 13 May 2025 04:02:25 +0000 (09:32 +0530)
committerHimal Prasad Ghimiray <himal.prasad.ghimiray@intel.com>
Wed, 14 May 2025 13:55:54 +0000 (19:25 +0530)
The drm_gpusvm_find_vma_start() function is used to determine the starting
address of a CPU VMA within a specified user range. If the range does not
contain any VMA, the function returns ULONG_MAX.

v2
- Rename function as drm_gpusvm_find_vma_start() (Matthew Brost)
- mmget/mmput

v3
- s/mmget/mmget_not_zero/

Reviewed-by: Matthew Brost <matthew.brost@intel.com>
Link: https://lore.kernel.org/r/20250513040228.470682-13-himal.prasad.ghimiray@intel.com
Signed-off-by: Himal Prasad Ghimiray <himal.prasad.ghimiray@intel.com>
drivers/gpu/drm/drm_gpusvm.c
include/drm/drm_gpusvm.h

index 4b2f32889f00f86674fa318ce9c2412bce438a3c..7bb9eb71c9aa5c096dc12233d9c465e016709208 100644 (file)
@@ -980,6 +980,40 @@ static void drm_gpusvm_driver_lock_held(struct drm_gpusvm *gpusvm)
 }
 #endif
 
+/**
+ * drm_gpusvm_find_vma_start() - Find start address for first VMA in range
+ * @gpusvm: Pointer to the GPU SVM structure
+ * @start: The inclusive start user address.
+ * @end: The exclusive end user address.
+ *
+ * Returns: The start address of first VMA within the provided range,
+ * ULONG_MAX otherwise. Assumes start_addr < end_addr.
+ */
+unsigned long
+drm_gpusvm_find_vma_start(struct drm_gpusvm *gpusvm,
+                         unsigned long start,
+                         unsigned long end)
+{
+       struct mm_struct *mm = gpusvm->mm;
+       struct vm_area_struct *vma;
+       unsigned long addr = ULONG_MAX;
+
+       if (!mmget_not_zero(mm))
+               return addr;
+
+       mmap_read_lock(mm);
+
+       vma = find_vma_intersection(mm, start, end);
+       if (vma)
+               addr =  vma->vm_start;
+
+       mmap_read_unlock(mm);
+       mmput(mm);
+
+       return addr;
+}
+EXPORT_SYMBOL_GPL(drm_gpusvm_find_vma_start);
+
 /**
  * drm_gpusvm_range_find_or_insert() - Find or insert GPU SVM range
  * @gpusvm: Pointer to the GPU SVM structure
index eaf704d3d05e8b7d946fcf7e09d4f3d18391c1f6..6a5156476bf477d169d640b50d2a82e2aff1a2f1 100644 (file)
@@ -327,6 +327,11 @@ void drm_gpusvm_fini(struct drm_gpusvm *gpusvm);
 
 void drm_gpusvm_free(struct drm_gpusvm *gpusvm);
 
+unsigned long
+drm_gpusvm_find_vma_start(struct drm_gpusvm *gpusvm,
+                         unsigned long start,
+                         unsigned long end);
+
 struct drm_gpusvm_range *
 drm_gpusvm_range_find_or_insert(struct drm_gpusvm *gpusvm,
                                unsigned long fault_addr,