drm/gpusvm: Introduce drm_gpusvm_find_vma_start() function

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>
This commit is contained in:
Himal Prasad Ghimiray
2025-05-13 09:32:25 +05:30
parent 6275362f18
commit 72fa870957
2 changed files with 39 additions and 0 deletions

View 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

View 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,