Re: [RFC 06/15] drm/xe: Extract xe_vma_lock_and_validate helper

Matthew Brost
2026-04-01T22:03:14Z

On Wed, Mar 18, 2026 at 01:14:47PM +0530, Himal Prasad Ghimiray wrote:
> Move xe_pagefault_begin to xe_vm.c as xe_vma_lock_and_validate for reuse
> in access counter processing.
>
> Signed-off-by: Himal Prasad Ghimiray <himal.prasad.ghimiray@intel.com>

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

> ---
> drivers/gpu/drm/xe/xe_pagefault.c | 22 ++--------------------
> drivers/gpu/drm/xe/xe_vm.c | 31 +++++++++++++++++++++++++++++++
> drivers/gpu/drm/xe/xe_vm.h | 3 +++
> 3 files changed, 36 insertions(+), 20 deletions(-)
>
> diff --git a/drivers/gpu/drm/xe/xe_pagefault.c b/drivers/gpu/drm/xe/xe_pagefault.c
> index 67dd07927684..8c159e3512ee 100644
> --- a/drivers/gpu/drm/xe/xe_pagefault.c
> +++ b/drivers/gpu/drm/xe/xe_pagefault.c
> @@ -45,24 +45,6 @@ static int xe_pagefault_entry_size(void)
> return roundup_pow_of_two(sizeof(struct xe_pagefault));
> }
>
> -static int xe_pagefault_begin(struct drm_exec *exec, struct xe_vma *vma,
> - struct xe_vram_region *vram, bool need_vram_move)
> -{
> - struct xe_bo *bo = xe_vma_bo(vma);
> - struct xe_vm *vm = xe_vma_vm(vma);
> - int err;
> -
> - err = xe_vm_lock_vma(exec, vma);
> - if (err)
> - return err;
> -
> - if (!bo)
> - return 0;
> -
> - return need_vram_move ? xe_bo_migrate(bo, vram->placement, NULL, exec) :
> - xe_bo_validate(bo, vm, true, exec);
> -}
> -
> static int xe_pagefault_handle_vma(struct xe_gt *gt, struct xe_vma *vma,
> bool atomic)
> {
> @@ -103,8 +85,8 @@ static int xe_pagefault_handle_vma(struct xe_gt *gt, struct xe_vma *vma,
> /* Lock VM and BOs dma-resv */
> xe_validation_ctx_init(&ctx, &vm->xe->val, &exec, (struct xe_val_flags) {});
> drm_exec_until_all_locked(&exec) {
> - err = xe_pagefault_begin(&exec, vma, tile->mem.vram,
> - needs_vram == 1);
> + err = xe_vma_lock_and_validate(&exec, vma, tile->mem.vram,
> + needs_vram == 1);
> drm_exec_retry_on_contention(&exec);
> xe_validation_retry_on_oom(&ctx, &err);
> if (err)
> diff --git a/drivers/gpu/drm/xe/xe_vm.c b/drivers/gpu/drm/xe/xe_vm.c
> index 5572e12c2a7e..659504ec5a13 100644
> --- a/drivers/gpu/drm/xe/xe_vm.c
> +++ b/drivers/gpu/drm/xe/xe_vm.c
> @@ -1170,6 +1170,37 @@ int xe_vm_lock_vma(struct drm_exec *exec, struct xe_vma *vma)
> return err;
> }
>
> +/**
> + * xe_vma_lock_and_validate - Lock Vma and Validate bo location
> + * @exec: drm execution context
> + * @vma: VMA to prepare
> + * @vram: target VRAM region
> + * @need_vram_move: true if BO must be moved to VRAM
> + *
> + * Locks the VMA and its associated BO, then ensures the BO is in the correct
> + * memory location for GPU access. If need_vram_move is true, migrates the BO
> + * to VRAM; otherwise validates it in its current location.
> + *
> + * Return: 0 on success, negative error code on failure
> + */
> +int xe_vma_lock_and_validate(struct drm_exec *exec, struct xe_vma *vma,
> + struct xe_vram_region *vram, bool need_vram_move)
> +{
> + struct xe_bo *bo = xe_vma_bo(vma);
> + struct xe_vm *vm = xe_vma_vm(vma);
> + int err;
> +
> + err = xe_vm_lock_vma(exec, vma);
> + if (err)
> + return err;
> +
> + if (!bo)
> + return 0;
> +
> + return need_vram_move ? xe_bo_migrate(bo, vram->placement, NULL, exec) :
> + xe_bo_validate(bo, vm, true, exec);
> +}
> +
> static void xe_vma_destroy_unlocked(struct xe_vma *vma)
> {
> struct xe_device *xe = xe_vma_vm(vma)->xe;
> diff --git a/drivers/gpu/drm/xe/xe_vm.h b/drivers/gpu/drm/xe/xe_vm.h
> index 0bc7ed23eeae..127cecfcb80b 100644
> --- a/drivers/gpu/drm/xe/xe_vm.h
> +++ b/drivers/gpu/drm/xe/xe_vm.h
> @@ -271,6 +271,9 @@ static inline void xe_vm_reactivate_rebind(struct xe_vm *vm)
>
> int xe_vm_lock_vma(struct drm_exec *exec, struct xe_vma *vma);
>
> +int xe_vma_lock_and_validate(struct drm_exec *exec, struct xe_vma *vma,
> + struct xe_vram_region *vram, bool need_vram_move);
> +
> int xe_vm_validate_rebind(struct xe_vm *vm, struct drm_exec *exec,
> unsigned int num_fences);
>
> --
> 2.34.1
>