mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
synced 2026-04-06 07:55:28 -04:00
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:
@@ -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
|
||||
|
||||
@@ -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,
|
||||
|
||||
Reference in New Issue
Block a user