[PATCH v6 16/20] drm/xe/svm: Add xe_svm_range_validate() and xe_svm_range_migrate_to_smem()
Matthew Brost
matthew.brost at intel.com
Wed Apr 30 14:50:06 UTC 2025
On Wed, Apr 30, 2025 at 05:49:08PM +0530, Himal Prasad Ghimiray wrote:
> The xe_svm_range_validate() function checks if a range is
> valid and located in the desired memory region.
>
> xe_svm_range_migrate_to_smem() checks if range have pages in devmem and
> migrate them to smem.
>
> v2
> - Fix function stub in xe_svm.h
> - Fix doc
>
> v3 (Matthew Brost)
> - Remove extra new line
> - s/range->base.flags.has_devmem_pages/xe_svm_range_in_vram
>
> v4 (Matthew Brost)
> - s/xe_svm_range_in_vram/range->base.flags.has_devmem_pages
> - Move eviction logic to separate function
>
> Signed-off-by: Himal Prasad Ghimiray <himal.prasad.ghimiray at intel.com>
Reviewed-by: Matthew Brost <matthew.brost at intel.com>
> ---
> drivers/gpu/drm/xe/xe_svm.c | 41 +++++++++++++++++++++++++++++++++++++
> drivers/gpu/drm/xe/xe_svm.h | 19 +++++++++++++++++
> 2 files changed, 60 insertions(+)
>
> diff --git a/drivers/gpu/drm/xe/xe_svm.c b/drivers/gpu/drm/xe/xe_svm.c
> index cb4a849c018b..fff3a279e232 100644
> --- a/drivers/gpu/drm/xe/xe_svm.c
> +++ b/drivers/gpu/drm/xe/xe_svm.c
> @@ -643,6 +643,47 @@ static bool xe_svm_range_is_valid(struct xe_svm_range *range,
> (!devmem_only || xe_svm_range_in_vram(range));
> }
>
> +/** xe_svm_range_migrate_to_smem() - Move range pages from VRAM to SMEM
> + * @vm: xe_vm pointer
> + * @range: Pointer to the SVM range structure
> + *
> + * The xe_svm_range_migrate_to_smem() checks range has pages in VRAM
> + * and migrates them to SMEM
> + */
> +void xe_svm_range_migrate_to_smem(struct xe_vm *vm, struct xe_svm_range *range)
> +{
> + if (xe_svm_range_in_vram(range))
> + drm_gpusvm_range_evict(&vm->svm.gpusvm, &range->base);
> +}
> +
> +/**
> + * xe_svm_range_validate() - Check if the SVM range is valid
> + * @vm: xe_vm pointer
> + * @range: Pointer to the SVM range structure
> + * @tile_mask: Mask representing the tiles to be checked
> + * @devmem_preferred : if true range needs to be in devmem
> + *
> + * The xe_svm_range_validate() function checks if a range is
> + * valid and located in the desired memory region.
> + *
> + * Return: true if the range is valid, false otherwise
> + */
> +bool xe_svm_range_validate(struct xe_vm *vm,
> + struct xe_svm_range *range,
> + u8 tile_mask, bool devmem_preferred)
> +{
> + bool ret;
> +
> + xe_svm_notifier_lock(vm);
> +
> + ret = (range->tile_present & ~range->tile_invalidated & tile_mask) == tile_mask &&
> + (devmem_preferred == range->base.flags.has_devmem_pages);
> +
> + xe_svm_notifier_unlock(vm);
> +
> + return ret;
> +}
> +
> #if IS_ENABLED(CONFIG_DRM_XE_DEVMEM_MIRROR)
> static struct xe_vram_region *tile_to_vr(struct xe_tile *tile)
> {
> diff --git a/drivers/gpu/drm/xe/xe_svm.h b/drivers/gpu/drm/xe/xe_svm.h
> index 9be7bb25725c..3f8c82f9c363 100644
> --- a/drivers/gpu/drm/xe/xe_svm.h
> +++ b/drivers/gpu/drm/xe/xe_svm.h
> @@ -83,6 +83,12 @@ int xe_svm_range_get_pages(struct xe_vm *vm, struct xe_svm_range *range,
> bool xe_svm_range_needs_migrate_to_vram(struct xe_svm_range *range, struct xe_vma *vma,
> bool preferred_region_is_vram);
>
> +void xe_svm_range_migrate_to_smem(struct xe_vm *vm, struct xe_svm_range *range);
> +
> +bool xe_svm_range_validate(struct xe_vm *vm,
> + struct xe_svm_range *range,
> + u8 tile_mask, bool devmem_preferred);
> +
> /**
> * xe_svm_range_has_dma_mapping() - SVM range has DMA mapping
> * @range: SVM range
> @@ -276,6 +282,19 @@ bool xe_svm_range_needs_migrate_to_vram(struct xe_svm_range *range, struct xe_vm
> return false;
> }
>
> +static inline
> +void xe_svm_range_migrate_to_smem(struct xe_vm *vm, struct xe_svm_range *range)
> +{
> +}
> +
> +static inline
> +bool xe_svm_range_validate(struct xe_vm *vm,
> + struct xe_svm_range *range,
> + u8 tile_mask, bool devmem_preferred)
> +{
> + return false;
> +}
> +
> #define xe_svm_assert_in_notifier(...) do {} while (0)
> #define xe_svm_range_has_dma_mapping(...) false
>
> --
> 2.34.1
>
More information about the Intel-xe
mailing list