From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from gabe.freedesktop.org (gabe.freedesktop.org [131.252.210.177]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.lore.kernel.org (Postfix) with ESMTPS id AA8CAEE14A0 for ; Wed, 6 Sep 2023 15:39:51 +0000 (UTC) Received: from gabe.freedesktop.org (localhost [127.0.0.1]) by gabe.freedesktop.org (Postfix) with ESMTP id 7DC8310E6A1; Wed, 6 Sep 2023 15:39:51 +0000 (UTC) Received: from mgamail.intel.com (mgamail.intel.com [134.134.136.126]) by gabe.freedesktop.org (Postfix) with ESMTPS id B830310E6A0 for ; Wed, 6 Sep 2023 15:39:48 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=intel.com; i=@intel.com; q=dns/txt; s=Intel; t=1694014788; x=1725550788; h=from:to:cc:subject:date:message-id:in-reply-to: references:mime-version:content-transfer-encoding; bh=PKzzFyr2FKtTr2rkSJutMjFHXGU5ToqrLq+xY6tyLcA=; b=EuAbuO4aoWBb3lVMOBep1H+rca2pg6qL0sSUW/wgIe7SXo/HX5X1eVnE SPHvjnoXz+bm56xipGZJ/8NEsRMoTbal3Fh/r0NddJFj9xBcFp/n6DUyE Cx+Nh6TgvcMtZVUPInraJdNeCIuLOgcgBMzUkNPugeRsP0JbizbqfKEbx BSGpDsFFcM/CWhuLk1lIB+zKI5VZFdH14HuN/0phrg6eCIPbHICy/xZAh tX2xNNG7OxG9V8tPonslnFQPT3mhWEnu/+GIA+bkzY3uP++0RSSO/AQmC ii1bXDIhHvPobVe6DU05sb6p5Sf+/qDoA7Hg7Um868ZJ2hfLX6wAI+eQ7 w==; X-IronPort-AV: E=McAfee;i="6600,9927,10825"; a="362131460" X-IronPort-AV: E=Sophos;i="6.02,232,1688454000"; d="scan'208";a="362131460" Received: from fmsmga006.fm.intel.com ([10.253.24.20]) by orsmga106.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 06 Sep 2023 08:39:48 -0700 X-ExtLoop1: 1 X-IronPort-AV: E=McAfee;i="6600,9927,10825"; a="988287149" X-IronPort-AV: E=Sophos;i="6.02,232,1688454000"; d="scan'208";a="988287149" Received: from yinbingc-mobl.ccr.corp.intel.com (HELO fedora..) ([10.249.254.11]) by fmsmga006-auth.fm.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 06 Sep 2023 08:39:46 -0700 From: =?UTF-8?q?Thomas=20Hellstr=C3=B6m?= To: intel-xe@lists.freedesktop.org Date: Wed, 6 Sep 2023 17:39:15 +0200 Message-ID: <20230906153916.5665-6-thomas.hellstrom@linux.intel.com> X-Mailer: git-send-email 2.41.0 In-Reply-To: <20230906153916.5665-1-thomas.hellstrom@linux.intel.com> References: <20230906153916.5665-1-thomas.hellstrom@linux.intel.com> MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Subject: [Intel-xe] [PATCH v5 5/6] drm/xe: Convert pagefaulting code to use drm_exec X-BeenThere: intel-xe@lists.freedesktop.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: Intel Xe graphics driver List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: intel-xe-bounces@lists.freedesktop.org Sender: "Intel-xe" Replace the calls into ttm_eu_reserve_buffers with the drm_exec helpers. Also reuse some code. v4: - Kerneldoc xe_vm_prepare_vma(). Signed-off-by: Thomas Hellström Reviewed-by: Matthew Brost --- drivers/gpu/drm/xe/xe_gt_pagefault.c | 106 ++++++++++++--------------- drivers/gpu/drm/xe/xe_vm.c | 27 +++++++ drivers/gpu/drm/xe/xe_vm.h | 3 + 3 files changed, 76 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 #include +#include #include #include @@ -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 8b949a647e7c..0df59e2926da 100644 --- a/drivers/gpu/drm/xe/xe_vm.c +++ b/drivers/gpu/drm/xe/xe_vm.c @@ -1090,6 +1090,33 @@ static void xe_vma_destroy(struct xe_vma *vma, struct dma_fence *fence) } } +/** + * xe_vm_prepare_vma() - drm_exec utility to lock a vma + * @exec: The drm_exec object we're currently locking for. + * @vma: The vma for witch we want to lock the vm resv and any attached + * object's resv. + * @num_shared: The number of dma-fence slots to pre-allocate in the + * objects' reservation objects. + * + * Return: 0 on success, negative error code on error. In particular + * may return -EDEADLK on WW transaction contention and -EINTR if + * an interruptible wait is terminated by a signal. + */ +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