From patchwork Wed Oct 12 11:16:37 2016 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Chris Wilson X-Patchwork-Id: 9372381 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 884AF60839 for ; Wed, 12 Oct 2016 11:16:54 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id 786A729373 for ; Wed, 12 Oct 2016 11:16:54 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id 64612293AF; Wed, 12 Oct 2016 11:16:54 +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 105E329373 for ; Wed, 12 Oct 2016 11:16:54 +0000 (UTC) Received: from gabe.freedesktop.org (localhost [127.0.0.1]) by gabe.freedesktop.org (Postfix) with ESMTP id EA9A26E818; Wed, 12 Oct 2016 11:16:52 +0000 (UTC) X-Original-To: intel-gfx@lists.freedesktop.org Delivered-To: intel-gfx@lists.freedesktop.org Received: from mail-lf0-x244.google.com (mail-lf0-x244.google.com [IPv6:2a00:1450:4010:c07::244]) by gabe.freedesktop.org (Postfix) with ESMTPS id E464A6E81B for ; Wed, 12 Oct 2016 11:16:50 +0000 (UTC) Received: by mail-lf0-x244.google.com with SMTP id x79so6571103lff.2 for ; Wed, 12 Oct 2016 04:16:50 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=sender:from:to:cc:subject:date:message-id:in-reply-to:references; bh=5b7UBUp9hRIEm3XZsM4PZkZad49KTNF7Cdw6CIjUb/U=; b=Lz0HBnuCc890bkCu7A9elNu1O+/SzW/USnBz+p6D8V7tCceDvXcLzdqaJGPcXNnJ1V LodSaixvHWGcJ41b/LB5SNrlN5gSeG0z2bYxp6Y5UhuG2LrBVdsPOfu74i1tAYnz01m1 tWbbBa38mE5PkC5HUTVA9HtlmGs7s53g7FsXkf2zTZ4M94Z6S44n8bey63+5OpyoDzmR 0aF910u6+hLXese9ZVXSqPiG1Wdagc7TirxCCZYTjAZHQhegjQZenZTGRXNir72J51iR kqXIfXeWoM7kkogyzlbUevd0l5+UNyLxaOvnRt7w9cSaK8Ya3aN8nCiwOaEKY2BjnilH Obsg== 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:cc:subject:date:message-id :in-reply-to:references; bh=5b7UBUp9hRIEm3XZsM4PZkZad49KTNF7Cdw6CIjUb/U=; b=ESAHWGpKbpbRNL+jRsRntimbtecQDkihMxGhK3Uevr3pyF1hd/Nt0dnQ5m0dmoe7md OkDQbyh7oROpdFU9khNWS/FK7rN1SGihBfU/MMqGuL6bYL+N1PtWMeyr5y0c7kYZ8VZr JVab24LWy3hzUappeGnYZHFbxosyEl851Lsoh4O2ACMzM3A44hufSQRGFqXgNH3cq3HF plQfZRLemBZJqr6+ydmZn+RxvFD2a7yPHX+tDC6SEEjLS2kT2wPUe7GNClIyXx1Zxxoa 0t5K8/wVn2K2/h/ivRNqzkDsxeq7VZWOWRiW8wgUz1edQKkMdait0Y5Xzwnisypymyki J5Vw== X-Gm-Message-State: AA6/9Rm9mTCGH4U+Np/7f8Y/ekokUiwzbpmtHSrMeht0vcOIlUZkhW8VKIZCclmgrk1hVw== X-Received: by 10.194.94.168 with SMTP id dd8mr691258wjb.96.1476271008879; Wed, 12 Oct 2016 04:16:48 -0700 (PDT) Received: from haswell.alporthouse.com ([78.156.65.138]) by smtp.gmail.com with ESMTPSA id jt8sm11986209wjc.33.2016.10.12.04.16.47 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Wed, 12 Oct 2016 04:16:47 -0700 (PDT) From: Chris Wilson To: intel-gfx@lists.freedesktop.org Date: Wed, 12 Oct 2016 12:16:37 +0100 Message-Id: <20161012111637.14784-5-chris@chris-wilson.co.uk> X-Mailer: git-send-email 2.9.3 In-Reply-To: <20161012111637.14784-1-chris@chris-wilson.co.uk> References: <20161012111637.14784-1-chris@chris-wilson.co.uk> Subject: [Intel-gfx] [PATCH 5/5] drm/i915: Remove superfluous locking around userfault_list 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 Now that we have reduced the access to the list to either (a) under the struct_mutex whilst holding the RPM wakeref (so that concurrent writers to the list are serialised by struct_mutex) and (b) under the atomic runtime suspend (which cannot run concurrently with any other accessor due to the atomic nature of the runtime suspend) we can remove the extra locking around the list itself. Signed-off-by: Chris Wilson --- drivers/gpu/drm/i915/i915_drv.h | 3 --- drivers/gpu/drm/i915/i915_gem.c | 33 ++++++++++++--------------------- 2 files changed, 12 insertions(+), 24 deletions(-) diff --git a/drivers/gpu/drm/i915/i915_drv.h b/drivers/gpu/drm/i915/i915_drv.h index 72b3126c6c74..13ca968a760a 100644 --- a/drivers/gpu/drm/i915/i915_drv.h +++ b/drivers/gpu/drm/i915/i915_drv.h @@ -1359,9 +1359,6 @@ struct i915_gem_mm { */ struct list_head unbound_list; - /** Protects access to the userfault_list */ - spinlock_t userfault_lock; - /** List of all objects in gtt_space, currently mmaped by userspace. * All objects within this list must also be on bound_list. */ diff --git a/drivers/gpu/drm/i915/i915_gem.c b/drivers/gpu/drm/i915/i915_gem.c index 318501bb268c..b573a50148cb 100644 --- a/drivers/gpu/drm/i915/i915_gem.c +++ b/drivers/gpu/drm/i915/i915_gem.c @@ -1853,10 +1853,8 @@ int i915_gem_fault(struct vm_area_struct *area, struct vm_fault *vmf) goto err_unpin; assert_rpm_wakelock_held(dev_priv); - spin_lock(&dev_priv->mm.userfault_lock); if (list_empty(&obj->userfault_link)) list_add(&obj->userfault_link, &dev_priv->mm.userfault_list); - spin_unlock(&dev_priv->mm.userfault_lock); err_unpin: __i915_vma_unpin(vma); @@ -1926,7 +1924,6 @@ void i915_gem_release_mmap(struct drm_i915_gem_object *obj) { struct drm_i915_private *i915 = to_i915(obj->base.dev); - bool zap = false; /* Serialisation between user GTT access and our code depends upon * revoking the CPU's PTE whilst the mutex is held. The next user @@ -1939,15 +1936,10 @@ i915_gem_release_mmap(struct drm_i915_gem_object *obj) lockdep_assert_held(&i915->drm.struct_mutex); intel_runtime_pm_get(i915); - spin_lock(&i915->mm.userfault_lock); - if (!list_empty(&obj->userfault_link)) { - list_del_init(&obj->userfault_link); - zap = true; - } - spin_unlock(&i915->mm.userfault_lock); - if (!zap) + if (list_empty(&obj->userfault_link)) goto out; + list_del_init(&obj->userfault_link); drm_vma_node_unmap(&obj->base.vma_node, obj->base.dev->anon_inode->i_mapping); @@ -1967,21 +1959,21 @@ out: void i915_gem_release_all_mmaps(struct drm_i915_private *dev_priv) { - struct drm_i915_gem_object *obj; + struct drm_i915_gem_object *obj, *on; - spin_lock(&dev_priv->mm.userfault_lock); - while ((obj = list_first_entry_or_null(&dev_priv->mm.userfault_list, - struct drm_i915_gem_object, - userfault_link))) { - list_del_init(&obj->userfault_link); - spin_unlock(&dev_priv->mm.userfault_lock); + /* + * Only called during RPM suspend. All users of the userfault_list + * must be holding an RPM wakeref to ensure that this can not + * run concurrently with themselves (and use the struct_mutex for + * protection between themselves). + */ + list_for_each_entry_safe(obj, on, + &dev_priv->mm.userfault_list, userfault_link) { + list_del_init(&obj->userfault_link); drm_vma_node_unmap(&obj->base.vma_node, obj->base.dev->anon_inode->i_mapping); - - spin_lock(&dev_priv->mm.userfault_lock); } - spin_unlock(&dev_priv->mm.userfault_lock); } /** @@ -4468,7 +4460,6 @@ int i915_gem_init(struct drm_device *dev) int ret; mutex_lock(&dev->struct_mutex); - spin_lock_init(&dev_priv->mm.userfault_lock); if (!i915.enable_execlists) { dev_priv->gt.resume = intel_legacy_submission_resume;