[PATCH v5 17/20] drm/gpusvm: Introduce drm_gpusvm_range_find_or_insert_start() function
Ghimiray, Himal Prasad
himal.prasad.ghimiray at intel.com
Wed Apr 30 03:40:33 UTC 2025
On 30-04-2025 00:05, Matthew Brost wrote:
> On Tue, Apr 29, 2025 at 04:12:30PM +0530, Himal Prasad Ghimiray wrote:
>> The drm_gpusvm_range_find_or_insert_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.
>>
>> Signed-off-by: Himal Prasad Ghimiray <himal.prasad.ghimiray at intel.com>
>> ---
>> drivers/gpu/drm/drm_gpusvm.c | 29 +++++++++++++++++++++++++++++
>> include/drm/drm_gpusvm.h | 5 +++++
>> 2 files changed, 34 insertions(+)
>>
>> diff --git a/drivers/gpu/drm/drm_gpusvm.c b/drivers/gpu/drm/drm_gpusvm.c
>> index 40a56f38ff8e..bb7c589b8d15 100644
>> --- a/drivers/gpu/drm/drm_gpusvm.c
>> +++ b/drivers/gpu/drm/drm_gpusvm.c
>> @@ -980,6 +980,35 @@ static void drm_gpusvm_driver_lock_held(struct drm_gpusvm *gpusvm)
>> }
>> #endif
>>
>> +/**
>> + * drm_gpusvm_range_find_or_insert_start() - Find or insert start address for 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_range_find_or_insert_start(struct drm_gpusvm *gpusvm,
>> + unsigned long start,
>> + unsigned long end)
>
> We don't really do an insertion here, so maybe:
>
> s/drm_gpusvm_range_find_or_insert_start/drm_gpusvm_find_vma_start
Sure.
>
>> +{
>> + struct mm_struct *mm = gpusvm->mm;
>> + struct vm_area_struct *vma;
>> + unsigned long addr = ULONG_MAX;
Does this return in case of no vma found makes sense to you ?
Initially I thought of returning 0, but wasn't sure whether under any
scenario cpu vma can start at 0 or not.
>> +
>
> Hmm, do you think we need a mmget here? I'd expect this be called from a
> user context where we'd have a MM ref but maybe to be safe add a
> mmget/put?
Yup, mmget/mmput makes it more reliable. Will add it
>
> Matt
>
>> + mmap_read_lock(mm);
>> +
>> + vma = find_vma_intersection(mm, start, end);
>> + if (vma)
>> + addr = vma->vm_start;
>> +
>> + mmap_read_unlock(mm);
>> + return addr;
>> +}
>> +EXPORT_SYMBOL_GPL(drm_gpusvm_range_find_or_insert_start);
>> +
>> /**
>> * drm_gpusvm_range_find_or_insert() - Find or insert GPU SVM range
>> * @gpusvm: Pointer to the GPU SVM structure
>> diff --git a/include/drm/drm_gpusvm.h b/include/drm/drm_gpusvm.h
>> index cce217bc136f..b0e9ee5c6226 100644
>> --- a/include/drm/drm_gpusvm.h
>> +++ b/include/drm/drm_gpusvm.h
>> @@ -315,6 +315,11 @@ void drm_gpusvm_fini(struct drm_gpusvm *gpusvm);
>>
>> void drm_gpusvm_free(struct drm_gpusvm *gpusvm);
>>
>> +unsigned long
>> +drm_gpusvm_range_find_or_insert_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,
>> --
>> 2.34.1
>>
More information about the Intel-xe
mailing list