[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