[PATCH v2 25/32] drm/xe/svm : Add svm ranges migration policy on atomic access

Matthew Brost matthew.brost at intel.com
Wed May 14 22:21:39 UTC 2025


On Mon, Apr 07, 2025 at 03:47:12PM +0530, Himal Prasad Ghimiray wrote:
> If the platform does not support atomic access on system memory, and the
> ranges are in system memory, but the user requires atomic accesses on
> the VMA, then migrate the ranges to VRAM. Apply this policy for prefetch
> operations as well.
> 

I think the baseline was changed a bit here, but I believe it mostly
makes sense. Will review again on the rebase.

A one nit below.

> Signed-off-by: Himal Prasad Ghimiray <himal.prasad.ghimiray at intel.com>
> ---
>  drivers/gpu/drm/xe/xe_pt.c         |  9 +++++++--
>  drivers/gpu/drm/xe/xe_svm.c        | 14 ++++++++++++--
>  drivers/gpu/drm/xe/xe_vm.c         |  2 ++
>  drivers/gpu/drm/xe/xe_vm_madvise.c | 11 ++++++++++-
>  4 files changed, 31 insertions(+), 5 deletions(-)
> 
> diff --git a/drivers/gpu/drm/xe/xe_pt.c b/drivers/gpu/drm/xe/xe_pt.c
> index 2479d830d90a..ba9b30b25ded 100644
> --- a/drivers/gpu/drm/xe/xe_pt.c
> +++ b/drivers/gpu/drm/xe/xe_pt.c
> @@ -645,13 +645,18 @@ static bool xe_atomic_for_vram(struct xe_vm *vm)
>  	return true;
>  }
>  
> -static bool xe_atomic_for_system(struct xe_vm *vm, struct xe_bo *bo)
> +static bool xe_atomic_for_system(struct xe_vm *vm,
> +				 struct xe_bo *bo,
> +				 struct xe_vma *vma)
>  {
>  	struct xe_device *xe = vm->xe;
>  
>  	if (!xe->info.has_device_atomics_on_smem)
>  		return false;
>  
> +	if (vma->attr.atomic_access == DRM_XE_VMA_ATOMIC_DEVICE)
> +		return true;
> +
>  	/*
>  	 * If a SMEM+LMEM allocation is backed by SMEM, a device
>  	 * atomics will cause a gpu page fault and which then
> @@ -745,7 +750,7 @@ xe_pt_stage_bind(struct xe_tile *tile, struct xe_vma *vma,
>  
>  	if (vma->gpuva.flags & XE_VMA_ATOMIC_PTE_BIT) {
>  		xe_walk.default_vram_pte = xe_atomic_for_vram(vm) ? XE_USM_PPGTT_PTE_AE : 0;
> -		xe_walk.default_system_pte = xe_atomic_for_system(vm, bo) ?
> +		xe_walk.default_system_pte = xe_atomic_for_system(vm, bo, vma) ?
>  			XE_USM_PPGTT_PTE_AE : 0;
>  	}
>  
> diff --git a/drivers/gpu/drm/xe/xe_svm.c b/drivers/gpu/drm/xe/xe_svm.c
> index efcba4b77250..d40111e29bfe 100644
> --- a/drivers/gpu/drm/xe/xe_svm.c
> +++ b/drivers/gpu/drm/xe/xe_svm.c
> @@ -717,6 +717,16 @@ static bool supports_4K_migration(struct xe_device *xe)
>  	return false;
>  }
>  
> +static bool needs_ranges_in_vram_to_support_atomic(struct xe_device *xe, struct xe_vma *vma)
> +{
> +	if (vma->attr.atomic_access == DRM_XE_VMA_ATOMIC_UNDEFINED ||
> +	    (xe->info.has_device_atomics_on_smem &&
> +	     vma->attr.atomic_access == DRM_XE_VMA_ATOMIC_DEVICE))
> +		return false;
> +
> +	return true;
> +}
> +
>  /**
>   * xe_svm_range_needs_migrate_to_vram() - SVM range needs migrate to VRAM or not
>   * @range: SVM range for which migration needs to be decided
> @@ -735,7 +745,7 @@ bool xe_svm_range_needs_migrate_to_vram(struct xe_svm_range *range, struct xe_vm
>  	if (!range->base.flags.migrate_devmem)
>  		return false;
>  
> -	needs_migrate = region;
> +	needs_migrate =  needs_ranges_in_vram_to_support_atomic(vm->xe, vma) || region;
>  
>  	if (needs_migrate && !IS_DGFX(vm->xe)) {
>  		drm_warn(&vm->xe->drm, "Platform doesn't support VRAM\n");
> @@ -828,7 +838,7 @@ int xe_svm_handle_pagefault(struct xe_vm *vm, struct xe_vma *vma,
>  
>  	}
>  
> -	if (atomic)
> +	if (atomic && needs_ranges_in_vram_to_support_atomic(vm->xe, vma))
>  		ctx.vram_only = 1;
>  
>  	range_debug(range, "GET PAGES");
> diff --git a/drivers/gpu/drm/xe/xe_vm.c b/drivers/gpu/drm/xe/xe_vm.c
> index 92b8e0cac063..0f9c45ce82b4 100644
> --- a/drivers/gpu/drm/xe/xe_vm.c
> +++ b/drivers/gpu/drm/xe/xe_vm.c
> @@ -2930,6 +2930,7 @@ static int prefetch_ranges_lock_and_prep(struct xe_vm *vm,
>  		for (i = 0; i < op->prefetch_range.ranges_count; i++) {
>  			svm_range = xa_load(&op->prefetch_range.range, i);
>  			if (xe_svm_range_needs_migrate_to_vram(svm_range, vma, region)) {
> +				region = region ? region : 1;
>  				tile = &vm->xe->tiles[region_to_mem_type[region] - XE_PL_VRAM0];
>  				err = xe_svm_alloc_vram(vm, tile, svm_range, &ctx);
>  				if (err) {
> @@ -2938,6 +2939,7 @@ static int prefetch_ranges_lock_and_prep(struct xe_vm *vm,
>  					return -ENODATA;
>  				}
>  				xe_svm_range_debug(svm_range, "PREFETCH - RANGE MIGRATED TO VRAM");
> +				ctx.vram_only = 1;
>  			}
>  
>  			err = xe_svm_range_get_pages(vm, svm_range, &ctx);
> diff --git a/drivers/gpu/drm/xe/xe_vm_madvise.c b/drivers/gpu/drm/xe/xe_vm_madvise.c
> index ef50031649e0..7e1a95106cb9 100644
> --- a/drivers/gpu/drm/xe/xe_vm_madvise.c
> +++ b/drivers/gpu/drm/xe/xe_vm_madvise.c
> @@ -69,7 +69,16 @@ static int madvise_atomic(struct xe_device *xe, struct xe_vm *vm,
>  			  struct xe_vma **vmas, int num_vmas,
>  			  struct drm_xe_madvise_ops ops)
>  {
> -	/* Implementation pending */
> +	int i;
> +
> +	xe_assert(vm->xe, ops.type == DRM_XE_VMA_ATTR_ATOMIC);
> +	xe_assert(vm->xe, ops.atomic.val > DRM_XE_VMA_ATOMIC_UNDEFINED &&
> +		  ops.atomic.val <= DRM_XE_VMA_ATOMIC_CPU);
> +	vm_dbg(&xe->drm, "attr_value = %d", ops.atomic.val);

Again I'm unsure if this debug message how a ton of value without
knowing the VMA info.

Matt

> +
> +	for (i = 0; i < num_vmas; i++)
> +		vmas[i]->attr.atomic_access = ops.atomic.val;
> +	/*TODO: handle bo backed vmas */
>  	return 0;
>  }
>  
> -- 
> 2.34.1
> 


More information about the Intel-xe mailing list