From patchwork Fri Jul 1 16:23:14 2016 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Chris Wilson X-Patchwork-Id: 9210165 Return-Path: Received: from mail.wl.linuxfoundation.org (pdx-wl-mail.web.codeaurora.org [172.30.200.125]) by pdx-korg-patchwork.web.codeaurora.org (Postfix) with ESMTP id 9F3C7607D8 for ; Fri, 1 Jul 2016 16:23:47 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id 90AC3284EE for ; Fri, 1 Jul 2016 16:23:47 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id 859162868D; Fri, 1 Jul 2016 16:23:47 +0000 (UTC) X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on pdx-wl-mail.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-4.1 required=2.0 tests=BAYES_00,DKIM_SIGNED, RCVD_IN_DNSWL_MED,T_DKIM_INVALID autolearn=ham version=3.3.1 Received: from gabe.freedesktop.org (gabe.freedesktop.org [131.252.210.177]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id 1F737284EE for ; Fri, 1 Jul 2016 16:23:47 +0000 (UTC) Received: from gabe.freedesktop.org (localhost [127.0.0.1]) by gabe.freedesktop.org (Postfix) with ESMTP id BFE406E1D0; Fri, 1 Jul 2016 16:23:45 +0000 (UTC) X-Original-To: intel-gfx@lists.freedesktop.org Delivered-To: intel-gfx@lists.freedesktop.org Received: from mail-wm0-x243.google.com (mail-wm0-x243.google.com [IPv6:2a00:1450:400c:c09::243]) by gabe.freedesktop.org (Postfix) with ESMTPS id 036656E1C7 for ; Fri, 1 Jul 2016 16:23:44 +0000 (UTC) Received: by mail-wm0-x243.google.com with SMTP id r201so6424388wme.0 for ; Fri, 01 Jul 2016 09:23:43 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=sender:from:to:subject:date:message-id:in-reply-to:references; bh=b989S5JyPu0WDn8nekumhoF2jNAL2Sx6/mKYFUeN8vE=; b=ybu2omu+6rY7VZ8pPXrw5xTlMlJQvcammUavam2YO7El/3Ye5ZzvVxCnG6TRlDe/hw XH5aBL3E52YyglCk8ypCQyarkVyLnGmtUlKjdH30GtZI56S6gBIM6tDjAKrGTxdJDIvb zaeHOuiY6DVBKclGhdqN0x8aQ26XTHZ//WfJaQiCbaHTMdM+JOrgBmUSZBm2ClbJPJn2 +er1AJc/2cD8GOffXZwKBjDxwGAb75qAeJ3amyjrlfyINFi5HOTAfRIx/W0fYlqkEyUR Cr7OyCKjPCkN/GinhVUOvsfuD2BV5jcSOxkgNQswvWv9cERDbo/W2szIEFw/NjH2fWlV QMyQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=x-gm-message-state:sender:from:to:subject:date:message-id :in-reply-to:references; bh=b989S5JyPu0WDn8nekumhoF2jNAL2Sx6/mKYFUeN8vE=; b=PuPcui5x94rtOSnO4TM8Ok2ikP0ku+DrEkD1KiE2+9sZCfZ2RrnriGnkAqDtHfRDee su8a+OPC+UjncQZyrF8qronmGbBitmeDizAU/epVe7so2tGxaMdklgNVKj1UxeTrosVB WrwKcxdixPWxWXKreVI6RxRdPfQ/3A7FfWGWfMIjvzERNBiEzo8MPAWDBVtAc+PnoDCZ hCxjmlthIXtSj4DJKmRHowlGsYKS9KGspo62tgnp8AzoVCVPbyZnd9B3IOOzJtglQp+C S1mqkXn+ZiNJf5bBywiJJN1BdfHjLIgGzLVVY7XIRwaID1JYX1w6fKAxKZNzPgQ0ZKN3 RNsg== X-Gm-Message-State: ALyK8tL4ZozDjzl260cpaB0S9Dt6iku4EKWNqUX4BHzlzlSNhILxSg2eT3hDolZQ8R2eOQ== X-Received: by 10.194.191.233 with SMTP id hb9mr3951946wjc.127.1467390222301; Fri, 01 Jul 2016 09:23:42 -0700 (PDT) Received: from haswell.alporthouse.com ([78.156.65.138]) by smtp.gmail.com with ESMTPSA id yr4sm6357408wjc.18.2016.07.01.09.23.40 for (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Fri, 01 Jul 2016 09:23:41 -0700 (PDT) From: Chris Wilson To: intel-gfx@lists.freedesktop.org Date: Fri, 1 Jul 2016 17:23:14 +0100 Message-Id: <1467390209-3576-5-git-send-email-chris@chris-wilson.co.uk> X-Mailer: git-send-email 2.8.1 In-Reply-To: <1467390209-3576-1-git-send-email-chris@chris-wilson.co.uk> References: <1467390209-3576-1-git-send-email-chris@chris-wilson.co.uk> Subject: [Intel-gfx] [CI 05/20] drm/i915: Separate GPU hang waitqueue from advance 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-Virus-Scanned: ClamAV using ClamSMTP Currently __i915_wait_request uses a per-engine wait_queue_t for the dual purpose of waking after the GPU advances or for waking after an error. In the future, we may add even more wake sources and require greater separation, but for now we can conceptually simplify wakeups by separating the two sources. In particular, this allows us to use different wait-queues (e.g. one on the engine advancement, a global one for errors and one on each requests) without any hassle. Signed-off-by: Chris Wilson Reviewed-by: Tvrtko Ursulin --- drivers/gpu/drm/i915/i915_drv.h | 6 ++++++ drivers/gpu/drm/i915/i915_gem.c | 5 +++++ drivers/gpu/drm/i915/i915_irq.c | 19 ++++--------------- 3 files changed, 15 insertions(+), 15 deletions(-) diff --git a/drivers/gpu/drm/i915/i915_drv.h b/drivers/gpu/drm/i915/i915_drv.h index 4948c90c9bd4..0d0e4ac4dadb 100644 --- a/drivers/gpu/drm/i915/i915_drv.h +++ b/drivers/gpu/drm/i915/i915_drv.h @@ -1410,6 +1410,12 @@ struct i915_gpu_error { #define I915_WEDGED (1 << 31) /** + * Waitqueue to signal when a hang is detected. Used to for waiters + * to release the struct_mutex for the reset to procede. + */ + wait_queue_head_t wait_queue; + + /** * Waitqueue to signal when the reset has completed. Used by clients * that wait for dev_priv->mm.wedged to settle. */ diff --git a/drivers/gpu/drm/i915/i915_gem.c b/drivers/gpu/drm/i915/i915_gem.c index e0b1e286bf87..b5278d117ea0 100644 --- a/drivers/gpu/drm/i915/i915_gem.c +++ b/drivers/gpu/drm/i915/i915_gem.c @@ -1455,6 +1455,7 @@ int __i915_wait_request(struct drm_i915_gem_request *req, const bool irq_test_in_progress = ACCESS_ONCE(dev_priv->gpu_error.test_irq_rings) & intel_engine_flag(engine); int state = interruptible ? TASK_INTERRUPTIBLE : TASK_UNINTERRUPTIBLE; + DEFINE_WAIT(reset); DEFINE_WAIT(wait); unsigned long timeout_expire; s64 before = 0; /* Only to silence a compiler warning. */ @@ -1499,6 +1500,7 @@ int __i915_wait_request(struct drm_i915_gem_request *req, goto out; } + add_wait_queue(&dev_priv->gpu_error.wait_queue, &reset); for (;;) { struct timer_list timer; @@ -1557,6 +1559,8 @@ int __i915_wait_request(struct drm_i915_gem_request *req, destroy_timer_on_stack(&timer); } } + remove_wait_queue(&dev_priv->gpu_error.wait_queue, &reset); + if (!irq_test_in_progress) engine->irq_put(engine); @@ -5287,6 +5291,7 @@ i915_gem_load_init(struct drm_device *dev) i915_gem_retire_work_handler); INIT_DELAYED_WORK(&dev_priv->mm.idle_work, i915_gem_idle_work_handler); + init_waitqueue_head(&dev_priv->gpu_error.wait_queue); init_waitqueue_head(&dev_priv->gpu_error.reset_queue); dev_priv->relative_constants_mode = I915_EXEC_CONSTANTS_REL_GENERAL; diff --git a/drivers/gpu/drm/i915/i915_irq.c b/drivers/gpu/drm/i915/i915_irq.c index 83f40baeb1f3..6c17596d75dd 100644 --- a/drivers/gpu/drm/i915/i915_irq.c +++ b/drivers/gpu/drm/i915/i915_irq.c @@ -2488,11 +2488,8 @@ static irqreturn_t gen8_irq_handler(int irq, void *arg) return ret; } -static void i915_error_wake_up(struct drm_i915_private *dev_priv, - bool reset_completed) +static void i915_error_wake_up(struct drm_i915_private *dev_priv) { - struct intel_engine_cs *engine; - /* * Notify all waiters for GPU completion events that reset state has * been changed, and that they need to restart their wait after @@ -2501,18 +2498,10 @@ static void i915_error_wake_up(struct drm_i915_private *dev_priv, */ /* Wake up __wait_seqno, potentially holding dev->struct_mutex. */ - for_each_engine(engine, dev_priv) - wake_up_all(&engine->irq_queue); + wake_up_all(&dev_priv->gpu_error.wait_queue); /* Wake up intel_crtc_wait_for_pending_flips, holding crtc->mutex. */ wake_up_all(&dev_priv->pending_flip_queue); - - /* - * Signal tasks blocked in i915_gem_wait_for_error that the pending - * reset state is cleared. - */ - if (reset_completed) - wake_up_all(&dev_priv->gpu_error.reset_queue); } /** @@ -2577,7 +2566,7 @@ static void i915_reset_and_wakeup(struct drm_i915_private *dev_priv) * Note: The wake_up also serves as a memory barrier so that * waiters see the update value of the reset counter atomic_t. */ - i915_error_wake_up(dev_priv, true); + wake_up_all(&dev_priv->gpu_error.reset_queue); } } @@ -2714,7 +2703,7 @@ void i915_handle_error(struct drm_i915_private *dev_priv, * ensure that the waiters see the updated value of the reset * counter atomic_t. */ - i915_error_wake_up(dev_priv, false); + i915_error_wake_up(dev_priv); } i915_reset_and_wakeup(dev_priv);