[Intel-xe] [PATCH v3 5/6] drm/xe: Convert pagefaulting code to use drm_exec

Matthew Brost matthew.brost at intel.com
Thu Aug 31 17:58:17 UTC 2023


On Thu, Aug 31, 2023 at 11:29:36AM +0200, Thomas Hellström wrote:
> Replace the calls into ttm_eu_reserve_buffers with the drm_exec helpers.
> Also reuse some code.
> 
> Signed-off-by: Thomas Hellström <thomas.hellstrom at linux.intel.com>

Reviewed-by: Matthew Brost <matthew.brost at intel.com>

> ---
>  drivers/gpu/drm/xe/xe_gt_pagefault.c | 106 ++++++++++++---------------
>  drivers/gpu/drm/xe/xe_vm.c           |  15 ++++
>  drivers/gpu/drm/xe/xe_vm.h           |   3 +
>  3 files changed, 64 insertions(+), 60 deletions(-)
> 
> diff --git a/drivers/gpu/drm/xe/xe_gt_pagefault.c b/drivers/gpu/drm/xe/xe_gt_pagefault.c
> index 73fc9389a663..e6197ec6f72f 100644
> --- a/drivers/gpu/drm/xe/xe_gt_pagefault.c
> +++ b/drivers/gpu/drm/xe/xe_gt_pagefault.c
> @@ -8,6 +8,7 @@
>  #include <linux/bitfield.h>
>  #include <linux/circ_buf.h>
>  
> +#include <drm/drm_exec.h>
>  #include <drm/drm_managed.h>
>  #include <drm/ttm/ttm_execbuf_util.h>
>  
> @@ -84,11 +85,6 @@ static bool vma_matches(struct xe_vma *vma, u64 page_addr)
>  	return true;
>  }
>  
> -static bool only_needs_bo_lock(struct xe_bo *bo)
> -{
> -	return bo && bo->vm;
> -}
> -
>  static struct xe_vma *lookup_vma(struct xe_vm *vm, u64 page_addr)
>  {
>  	struct xe_vma *vma = NULL;
> @@ -103,17 +99,44 @@ static struct xe_vma *lookup_vma(struct xe_vm *vm, u64 page_addr)
>  	return vma;
>  }
>  
> +static int xe_pf_begin(struct drm_exec *exec, struct xe_vma *vma,
> +		       unsigned int num_shared, bool atomic, unsigned int id)
> +{
> +	struct xe_bo *bo = xe_vma_bo(vma);
> +	struct xe_vm *vm = xe_vma_vm(vma);
> +	int err;
> +
> +	err = xe_vm_prepare_vma(exec, vma, num_shared);
> +	if (err)
> +		return err;
> +
> +	if (atomic) {
> +		if (xe_vma_is_userptr(vma)) {
> +			err = -EACCES;
> +			return err;
> +		}
> +
> +		/* Migrate to VRAM, move should invalidate the VMA first */
> +		err = xe_bo_migrate(bo, XE_PL_VRAM0 + id);
> +		if (err)
> +			return err;
> +	} else if (bo) {
> +		/* Create backing store if needed */
> +		err = xe_bo_validate(bo, vm, true);
> +		if (err)
> +			return err;
> +	}
> +
> +	return 0;
> +}
> +
>  static int handle_pagefault(struct xe_gt *gt, struct pagefault *pf)
>  {
>  	struct xe_device *xe = gt_to_xe(gt);
>  	struct xe_tile *tile = gt_to_tile(gt);
> +	struct drm_exec exec;
>  	struct xe_vm *vm;
>  	struct xe_vma *vma = NULL;
> -	struct xe_bo *bo;
> -	LIST_HEAD(objs);
> -	LIST_HEAD(dups);
> -	struct ttm_validate_buffer tv_bo, tv_vm;
> -	struct ww_acquire_ctx ww;
>  	struct dma_fence *fence;
>  	bool write_locked;
>  	int ret = 0;
> @@ -170,35 +193,10 @@ static int handle_pagefault(struct xe_gt *gt, struct pagefault *pf)
>  	}
>  
>  	/* Lock VM and BOs dma-resv */
> -	bo = xe_vma_bo(vma);
> -	if (!only_needs_bo_lock(bo)) {
> -		tv_vm.num_shared = xe->info.tile_count;
> -		tv_vm.bo = xe_vm_ttm_bo(vm);
> -		list_add(&tv_vm.head, &objs);
> -	}
> -	if (bo) {
> -		tv_bo.bo = &bo->ttm;
> -		tv_bo.num_shared = xe->info.tile_count;
> -		list_add(&tv_bo.head, &objs);
> -	}
> -
> -	ret = ttm_eu_reserve_buffers(&ww, &objs, false, &dups);
> -	if (ret)
> -		goto unlock_vm;
> -
> -	if (atomic) {
> -		if (xe_vma_is_userptr(vma)) {
> -			ret = -EACCES;
> -			goto unlock_dma_resv;
> -		}
> -
> -		/* Migrate to VRAM, move should invalidate the VMA first */
> -		ret = xe_bo_migrate(bo, XE_PL_VRAM0 + tile->id);
> -		if (ret)
> -			goto unlock_dma_resv;
> -	} else if (bo) {
> -		/* Create backing store if needed */
> -		ret = xe_bo_validate(bo, vm, true);
> +	drm_exec_init(&exec, 0);
> +	drm_exec_until_all_locked(&exec) {
> +		ret = xe_pf_begin(&exec, vma, xe->info.tile_count, atomic, tile->id);
> +		drm_exec_retry_on_contention(&exec);
>  		if (ret)
>  			goto unlock_dma_resv;
>  	}
> @@ -225,7 +223,7 @@ static int handle_pagefault(struct xe_gt *gt, struct pagefault *pf)
>  	vma->usm.tile_invalidated &= ~BIT(gt_to_tile(gt)->id);
>  
>  unlock_dma_resv:
> -	ttm_eu_backoff_reservation(&ww, &objs);
> +	drm_exec_fini(&exec);
>  unlock_vm:
>  	if (!ret)
>  		vm->usm.last_fault_vma = vma;
> @@ -490,13 +488,9 @@ static int handle_acc(struct xe_gt *gt, struct acc *acc)
>  {
>  	struct xe_device *xe = gt_to_xe(gt);
>  	struct xe_tile *tile = gt_to_tile(gt);
> +	struct drm_exec exec;
>  	struct xe_vm *vm;
>  	struct xe_vma *vma;
> -	struct xe_bo *bo;
> -	LIST_HEAD(objs);
> -	LIST_HEAD(dups);
> -	struct ttm_validate_buffer tv_bo, tv_vm;
> -	struct ww_acquire_ctx ww;
>  	int ret = 0;
>  
>  	/* We only support ACC_TRIGGER at the moment */
> @@ -528,23 +522,15 @@ static int handle_acc(struct xe_gt *gt, struct acc *acc)
>  		goto unlock_vm;
>  
>  	/* Lock VM and BOs dma-resv */
> -	bo = xe_vma_bo(vma);
> -	if (!only_needs_bo_lock(bo)) {
> -		tv_vm.num_shared = xe->info.tile_count;
> -		tv_vm.bo = xe_vm_ttm_bo(vm);
> -		list_add(&tv_vm.head, &objs);
> +	drm_exec_init(&exec, 0);
> +	drm_exec_until_all_locked(&exec) {
> +		ret = xe_pf_begin(&exec, vma, xe->info.tile_count, true, tile->id);
> +		drm_exec_retry_on_contention(&exec);
> +		if (ret)
> +			break;
>  	}
> -	tv_bo.bo = &bo->ttm;
> -	tv_bo.num_shared = xe->info.tile_count;
> -	list_add(&tv_bo.head, &objs);
> -	ret = ttm_eu_reserve_buffers(&ww, &objs, false, &dups);
> -	if (ret)
> -		goto unlock_vm;
> -
> -	/* Migrate to VRAM, move should invalidate the VMA first */
> -	ret = xe_bo_migrate(bo, XE_PL_VRAM0 + tile->id);
>  
> -	ttm_eu_backoff_reservation(&ww, &objs);
> +	drm_exec_fini(&exec);
>  unlock_vm:
>  	up_read(&vm->lock);
>  	xe_vm_put(vm);
> diff --git a/drivers/gpu/drm/xe/xe_vm.c b/drivers/gpu/drm/xe/xe_vm.c
> index b95a43d0af59..1547467c7d92 100644
> --- a/drivers/gpu/drm/xe/xe_vm.c
> +++ b/drivers/gpu/drm/xe/xe_vm.c
> @@ -1085,6 +1085,21 @@ static void xe_vma_destroy(struct xe_vma *vma, struct dma_fence *fence)
>  	}
>  }
>  
> +int xe_vm_prepare_vma(struct drm_exec *exec, struct xe_vma *vma,
> +		      unsigned int num_shared)
> +{
> +	struct xe_vm *vm = xe_vma_vm(vma);
> +	struct xe_bo *bo = xe_vma_bo(vma);
> +	int err;
> +
> +	XE_WARN_ON(!vm);
> +	err = drm_exec_prepare_obj(exec, &xe_vm_ttm_bo(vm)->base, num_shared);
> +	if (!err && bo && !bo->vm)
> +		err = drm_exec_prepare_obj(exec, &bo->ttm.base, num_shared);
> +
> +	return err;
> +}
> +
>  static void xe_vma_destroy_unlocked(struct xe_vma *vma)
>  {
>  	struct ttm_validate_buffer tv[2];
> diff --git a/drivers/gpu/drm/xe/xe_vm.h b/drivers/gpu/drm/xe/xe_vm.h
> index 4a1dd11f71c5..5608e4e33169 100644
> --- a/drivers/gpu/drm/xe/xe_vm.h
> +++ b/drivers/gpu/drm/xe/xe_vm.h
> @@ -222,6 +222,9 @@ void xe_vm_fence_all_extobjs(struct xe_vm *vm, struct dma_fence *fence,
>  
>  int xe_analyze_vm(struct drm_printer *p, struct xe_vm *vm, int gt_id);
>  
> +int xe_vm_prepare_vma(struct drm_exec *exec, struct xe_vma *vma,
> +		      unsigned int num_shared);
> +
>  #if IS_ENABLED(CONFIG_DRM_XE_DEBUG_VM)
>  #define vm_dbg drm_dbg
>  #else
> -- 
> 2.41.0
> 


More information about the Intel-xe mailing list