From patchwork Thu Dec 22 12:00:05 2016 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Chris Wilson X-Patchwork-Id: 9484697 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 9E4CB601D4 for ; Thu, 22 Dec 2016 12:00:25 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id 7D4D228429 for ; Thu, 22 Dec 2016 12:00:25 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id 6FBC92842C; Thu, 22 Dec 2016 12:00:25 +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]) (using TLSv1.2 with cipher DHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.wl.linuxfoundation.org (Postfix) with ESMTPS id 7738228429 for ; Thu, 22 Dec 2016 12:00:24 +0000 (UTC) Received: from gabe.freedesktop.org (localhost [127.0.0.1]) by gabe.freedesktop.org (Postfix) with ESMTP id C2E446F26F; Thu, 22 Dec 2016 12:00:17 +0000 (UTC) X-Original-To: intel-gfx@lists.freedesktop.org Delivered-To: intel-gfx@lists.freedesktop.org Received: from mail-wm0-x244.google.com (mail-wm0-x244.google.com [IPv6:2a00:1450:400c:c09::244]) by gabe.freedesktop.org (Postfix) with ESMTPS id 53AE06F264 for ; Thu, 22 Dec 2016 12:00:15 +0000 (UTC) Received: by mail-wm0-x244.google.com with SMTP id l2so10235627wml.2 for ; Thu, 22 Dec 2016 04:00:15 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=sender:from:to:cc:subject:date:message-id; bh=v6MDA3g921Iquk+1HubCPSZ6gbuv1KH5fz2DV1Yz4Ac=; b=BnIgLkq2eB4rAiSkOyLK94nuKy4oVpzApXLrYracdWzEaI/XLMFAD4KPxV3fPboxoQ QGYbyCp/XsDBw/0EMhGv3VLCvSbMpFgQQ46DZh0I7CG2gJ0jGt8zEQsr8U4XfXcbopqD ReghQpx0JBsz4zvUX3S8p67R2hOBVhkd1oXZ+KMnHaIUk6UXoxjvQCzQquHJBwaZPW66 iIk6ijnfrf+OHcA8qln9a3FoMK56FfPSiLY07htEXgpeu1fBd/IGVvR4osXSWuVLWNws FXR+C/H5bdSzzURbTxOt0fi8h2wqLttJuHN+bqIfvQ5xPGIMl3QYWYhIEzzk+CC/L/iX wHgA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:sender:from:to:cc:subject:date:message-id; bh=v6MDA3g921Iquk+1HubCPSZ6gbuv1KH5fz2DV1Yz4Ac=; b=KmcRLBNs9ZiuTokinVL+2+HX3oauPAK2/DP7tZRozY1OWeg2GkGtpkUKTxoa+S0fNc S6XGMR8fMYFtzTri0EoeBCPDm2XxHVFKQDUjum/iVQBoihDhAl3raOOIlE/Nc2Nr6Ew5 a28dUfy7b0uTyHBSMWL0PtWzK9UZCDYScZmt3vGF/t/B+C+AdxMDGqqt8jbNS6XxudbZ cn00dGLpqxuWdLprsJdEyyTP51HGN4eIKznRzCXsus0+xOQGyxLpcFz2xm4vAkwbo0zj 6fCf6xnHwRaVbPK4lDnynTQBngBqSJ7RcADB/W7M4f2n3M/0xyf6WP+WXiLHWT5pyZIu NEZw== X-Gm-Message-State: AIkVDXJ/Ovi+/cy/a1RYNP5kgzDKDTuhgriPTi2deSh4Vi0fYO7WNtZBz248d8ZmviIvwQ== X-Received: by 10.28.6.203 with SMTP id 194mr8957947wmg.16.1482408013424; Thu, 22 Dec 2016 04:00:13 -0800 (PST) Received: from haswell.alporthouse.com ([78.156.65.138]) by smtp.gmail.com with ESMTPSA id yj10sm35331116wjb.3.2016.12.22.04.00.12 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Thu, 22 Dec 2016 04:00:12 -0800 (PST) From: Chris Wilson To: intel-gfx@lists.freedesktop.org Date: Thu, 22 Dec 2016 12:00:05 +0000 Message-Id: <20161222120007.28590-1-chris@chris-wilson.co.uk> X-Mailer: git-send-email 2.11.0 Subject: [Intel-gfx] [PATCH 1/3] drm/i915: Repeat flush of idle work during suspend 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 The idle work handler is self-arming - if it detects that it needs to run again it will queue itself from its work handler. Take greater care when trying to drain the idle work, and double check that it is flushed. The free worker has a similar issue where it is armed by an RCU task which may be running concurrently with us. This should hopefully help with the sporadic WARN_ON(dev_priv->gt.awake) from i915_gem_suspend. v2: Reuse drain_freed_objects. v3: Don't try to flush the freed objects from the shrinker, as it may be underneath the struct_mutex already. Signed-off-by: Chris Wilson Reviewed-by: Joonas Lahtinen --- drivers/gpu/drm/i915/i915_drv.c | 3 +-- drivers/gpu/drm/i915/i915_drv.h | 7 +++++++ drivers/gpu/drm/i915/i915_gem.c | 6 ++++-- 3 files changed, 12 insertions(+), 4 deletions(-) diff --git a/drivers/gpu/drm/i915/i915_drv.c b/drivers/gpu/drm/i915/i915_drv.c index 6428588518aa..2c020eafada6 100644 --- a/drivers/gpu/drm/i915/i915_drv.c +++ b/drivers/gpu/drm/i915/i915_drv.c @@ -545,8 +545,7 @@ static void i915_gem_fini(struct drm_i915_private *dev_priv) i915_gem_context_fini(dev_priv); mutex_unlock(&dev_priv->drm.struct_mutex); - rcu_barrier(); - flush_work(&dev_priv->mm.free_work); + i915_gem_drain_freed_objects(dev_priv); WARN_ON(!list_empty(&dev_priv->context_list)); } diff --git a/drivers/gpu/drm/i915/i915_drv.h b/drivers/gpu/drm/i915/i915_drv.h index 77d7a079c51b..37ea557d3cd4 100644 --- a/drivers/gpu/drm/i915/i915_drv.h +++ b/drivers/gpu/drm/i915/i915_drv.h @@ -3207,6 +3207,13 @@ i915_gem_object_create_from_data(struct drm_i915_private *dev_priv, void i915_gem_close_object(struct drm_gem_object *gem, struct drm_file *file); void i915_gem_free_object(struct drm_gem_object *obj); +static inline void i915_gem_drain_freed_objects(struct drm_i915_private *i915) +{ + rcu_barrier(); + while (flush_work(&i915->mm.free_work)) + rcu_barrier(); +} + struct i915_vma * __must_check i915_gem_object_ggtt_pin(struct drm_i915_gem_object *obj, const struct i915_ggtt_view *view, diff --git a/drivers/gpu/drm/i915/i915_gem.c b/drivers/gpu/drm/i915/i915_gem.c index cc4e0224968f..62e1af5dd1b0 100644 --- a/drivers/gpu/drm/i915/i915_gem.c +++ b/drivers/gpu/drm/i915/i915_gem.c @@ -4262,8 +4262,10 @@ int i915_gem_suspend(struct drm_i915_private *dev_priv) cancel_delayed_work_sync(&dev_priv->gpu_error.hangcheck_work); cancel_delayed_work_sync(&dev_priv->gt.retire_work); - flush_delayed_work(&dev_priv->gt.idle_work); - flush_work(&dev_priv->mm.free_work); + while (flush_delayed_work(&dev_priv->gt.idle_work)) + ; + + i915_gem_drain_freed_objects(dev_priv); /* Assert that we sucessfully flushed all the work and * reset the GPU back to its idle, low power state.