From patchwork Fri Jul 17 14:33:26 2015 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: John Harrison X-Patchwork-Id: 6816411 Return-Path: X-Original-To: patchwork-intel-gfx@patchwork.kernel.org Delivered-To: patchwork-parsemail@patchwork2.web.kernel.org Received: from mail.kernel.org (mail.kernel.org [198.145.29.136]) by patchwork2.web.kernel.org (Postfix) with ESMTP id 6EE80C05AC for ; Fri, 17 Jul 2015 14:34:18 +0000 (UTC) Received: from mail.kernel.org (localhost [127.0.0.1]) by mail.kernel.org (Postfix) with ESMTP id 785FA20670 for ; Fri, 17 Jul 2015 14:34:17 +0000 (UTC) Received: from gabe.freedesktop.org (gabe.freedesktop.org [131.252.210.177]) by mail.kernel.org (Postfix) with ESMTP id 7FD752064F for ; Fri, 17 Jul 2015 14:34:16 +0000 (UTC) Received: from gabe.freedesktop.org (localhost [127.0.0.1]) by gabe.freedesktop.org (Postfix) with ESMTP id DEC326E512; Fri, 17 Jul 2015 07:34:15 -0700 (PDT) X-Original-To: Intel-GFX@lists.freedesktop.org Delivered-To: Intel-GFX@lists.freedesktop.org Received: from mga11.intel.com (mga11.intel.com [192.55.52.93]) by gabe.freedesktop.org (Postfix) with ESMTP id 090CE6E4E6 for ; Fri, 17 Jul 2015 07:34:11 -0700 (PDT) Received: from orsmga002.jf.intel.com ([10.7.209.21]) by fmsmga102.fm.intel.com with ESMTP; 17 Jul 2015 07:34:11 -0700 X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.15,497,1432623600"; d="scan'208";a="766366707" Received: from johnharr-linux.isw.intel.com ([10.102.226.190]) by orsmga002.jf.intel.com with ESMTP; 17 Jul 2015 07:34:09 -0700 From: John.C.Harrison@Intel.com To: Intel-GFX@Lists.FreeDesktop.Org Date: Fri, 17 Jul 2015 15:33:26 +0100 Message-Id: <1437143628-6329-18-git-send-email-John.C.Harrison@Intel.com> X-Mailer: git-send-email 1.9.1 In-Reply-To: <1437143628-6329-1-git-send-email-John.C.Harrison@Intel.com> References: <1437143628-6329-1-git-send-email-John.C.Harrison@Intel.com> Organization: Intel Corporation (UK) Ltd. - Co. Reg. #1134945 - Pipers Way, Swindon SN3 1RJ Subject: [Intel-gfx] [RFC 17/39] drm/i915: Hook scheduler node clean up into retire requests X-BeenThere: intel-gfx@lists.freedesktop.org X-Mailman-Version: 2.1.18 Precedence: list List-Id: Intel graphics driver community testing & development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , MIME-Version: 1.0 Errors-To: intel-gfx-bounces@lists.freedesktop.org Sender: "Intel-gfx" X-Spam-Status: No, score=-5.4 required=5.0 tests=BAYES_00, RCVD_IN_DNSWL_MED, RP_MATCHES_RCVD, UNPARSEABLE_RELAY autolearn=unavailable version=3.3.1 X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on mail.kernel.org X-Virus-Scanned: ClamAV using ClamSMTP From: John Harrison The scheduler keeps its own lock on various DRM objects in order to guarantee safe access long after the original execbuff IOCTL has completed. This is especially important when pre-emption is enabled as the batch buffer might need to be submitted to the hardware multiple times. This patch hooks the clean up of these locks into the request retire function. The request can only be retired after it has completed on the hardware and thus is no longer eligible for re-submission. Thus there is no point holding on to the locks beyond that time. For: VIZ-1587 Signed-off-by: John Harrison --- drivers/gpu/drm/i915/i915_gem.c | 3 +++ drivers/gpu/drm/i915/i915_scheduler.c | 51 ++++++++++++++++++++++++----------- drivers/gpu/drm/i915/i915_scheduler.h | 1 + 3 files changed, 39 insertions(+), 16 deletions(-) diff --git a/drivers/gpu/drm/i915/i915_gem.c b/drivers/gpu/drm/i915/i915_gem.c index 77a3b27..cb5af5d 100644 --- a/drivers/gpu/drm/i915/i915_gem.c +++ b/drivers/gpu/drm/i915/i915_gem.c @@ -1405,6 +1405,9 @@ static void i915_gem_request_retire(struct drm_i915_gem_request *request) if (!list_empty(&request->signal_list)) request->cancelled = true; + if (request->scheduler_qe) + i915_gem_scheduler_clean_node(request->scheduler_qe); + i915_gem_request_unreference(request); } diff --git a/drivers/gpu/drm/i915/i915_scheduler.c b/drivers/gpu/drm/i915/i915_scheduler.c index f5fa968..df2e27f 100644 --- a/drivers/gpu/drm/i915/i915_scheduler.c +++ b/drivers/gpu/drm/i915/i915_scheduler.c @@ -432,6 +432,38 @@ int i915_scheduler_handle_irq(struct intel_engine_cs *ring) return 0; } +void i915_gem_scheduler_clean_node(struct i915_scheduler_queue_entry *node) +{ + uint32_t i; + + if (WARN_ON(!I915_SQS_IS_COMPLETE(node))) + return; + + if (node->params.batch_obj) { + /* The batch buffer must be unpinned before it is unreferenced + * otherwise the unpin fails with a missing vma!? */ + if (node->params.dispatch_flags & I915_DISPATCH_SECURE) + i915_gem_execbuff_release_batch_obj(node->params.batch_obj); + + node->params.batch_obj = NULL; + } + + /* Release the locked buffers: */ + for (i = 0; i < node->num_objs; i++) { + drm_gem_object_unreference( + &node->saved_objects[i].obj->base); + } + kfree(node->saved_objects); + node->saved_objects = NULL; + node->num_objs = 0; + + /* Context too: */ + if (node->params.ctx) { + i915_gem_context_unreference(node->params.ctx); + node->params.ctx = NULL; + } +} + static int i915_scheduler_remove(struct intel_engine_cs *ring) { struct drm_i915_private *dev_priv = ring->dev->dev_private; @@ -441,7 +473,7 @@ static int i915_scheduler_remove(struct intel_engine_cs *ring) int flying = 0, queued = 0; int ret = 0; bool do_submit; - uint32_t i, min_seqno; + uint32_t min_seqno; struct list_head remove; if (list_empty(&scheduler->node_queue[ring->id])) @@ -535,21 +567,8 @@ static int i915_scheduler_remove(struct intel_engine_cs *ring) node = list_first_entry(&remove, typeof(*node), link); list_del(&node->link); - /* The batch buffer must be unpinned before it is unreferenced - * otherwise the unpin fails with a missing vma!? */ - if (node->params.dispatch_flags & I915_DISPATCH_SECURE) - i915_gem_execbuff_release_batch_obj(node->params.batch_obj); - - /* Release the locked buffers: */ - for (i = 0; i < node->num_objs; i++) { - drm_gem_object_unreference( - &node->saved_objects[i].obj->base); - } - kfree(node->saved_objects); - - /* Context too: */ - if (node->params.ctx) - i915_gem_context_unreference(node->params.ctx); + /* Free up all the DRM object references */ + i915_gem_scheduler_clean_node(node); /* And anything else owned by the node: */ node->params.request->scheduler_qe = NULL; diff --git a/drivers/gpu/drm/i915/i915_scheduler.h b/drivers/gpu/drm/i915/i915_scheduler.h index 15878a4..73c5e7d 100644 --- a/drivers/gpu/drm/i915/i915_scheduler.h +++ b/drivers/gpu/drm/i915/i915_scheduler.h @@ -88,6 +88,7 @@ bool i915_scheduler_is_enabled(struct drm_device *dev); int i915_scheduler_init(struct drm_device *dev); int i915_scheduler_closefile(struct drm_device *dev, struct drm_file *file); +void i915_gem_scheduler_clean_node(struct i915_scheduler_queue_entry *node); int i915_scheduler_queue_execbuffer(struct i915_scheduler_queue_entry *qe); int i915_scheduler_handle_irq(struct intel_engine_cs *ring); void i915_gem_scheduler_work_handler(struct work_struct *work);