Received: by 2002:ac0:a582:0:0:0:0:0 with SMTP id m2-v6csp1366534imm; Tue, 2 Oct 2018 07:10:00 -0700 (PDT) X-Google-Smtp-Source: ACcGV62UzD6bV3uxA7m5ycCTpHjrIWPyQ83mJpeStWE8tOnGG2drce4Aja+VgpjJfLMBAgS8ZZIX X-Received: by 2002:a17:902:7002:: with SMTP id y2-v6mr1587697plk.125.1538489400149; Tue, 02 Oct 2018 07:10:00 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1538489400; cv=none; d=google.com; s=arc-20160816; b=jRPkK6WeIMebgVcvl9A386L6kpC6bT3beYCYehDIp3Tc1o5mPRaMiP03gecn5I0Hjz yLF7oDfIyohmrU4yMln1ZDQk0QWKFvxfLkehdRGyDnRk+mtuCsJK5DDJHlZYWwjFsaRd XvWEo5ct+bhWEMjwvddhyKdtijT62w3EbLF7hisjMuUA/cxqDCwZYvlpQtNLdAsy3hty A+LpVTnUnG8S3f5az94NyeeyV9KRfnskNRW/2Qw4xrtU65pwoe911hLcOJI8fbJR6B4y olw5XdhFkkD8T8slPbyYlBl3rUJljd9Kp26BAI7XQbR4sZ7/ArvSSp5d0RBVX/iK0PQF p2kQ== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:content-transfer-encoding:mime-version :user-agent:references:in-reply-to:message-id:date:subject:cc:to :from; bh=TrlSZR7Ejlx5p8m1TQBC46TupToAVo04fomVvz5xTxw=; b=prYQXc+S9qSwt+qWomdXaC0xYL2oFicNw37kry5HvLLHuJCR9L+0eXbXCHBmfCt7jc AJINuZzhzrGHSlTN399jjR7OrEbw6GWbBkPSDykXpFF3eXi3f/C34qF/ZIYyXtEjSMAK Fzu2iQ3dbQVQBfYQIAe6RRmhabbR3mrDt7qWB5yBpwqhcdqegYnDhvfaom45UBBq2SsV IyjqGJEK7fHpv36fOPsOMquAjXQVBQTV5sZhDY5Ga/6YBchgVMh+4TvynnvtRyQlCJfq bZ1kbAGB7ZtMOzPcBK1fF8G0M69iGj+Zk5rrYRbosajtB5vSm+Wec8QfcAKU6aoBjl85 KyJQ== ARC-Authentication-Results: i=1; mx.google.com; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id c20-v6si16934955pfc.18.2018.10.02.07.09.44; Tue, 02 Oct 2018 07:10:00 -0700 (PDT) Received-SPF: pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) client-ip=209.132.180.67; Authentication-Results: mx.google.com; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1729072AbeJBULa (ORCPT + 99 others); Tue, 2 Oct 2018 16:11:30 -0400 Received: from mail.linuxfoundation.org ([140.211.169.12]:60726 "EHLO mail.linuxfoundation.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1729045AbeJBUL2 (ORCPT ); Tue, 2 Oct 2018 16:11:28 -0400 Received: from localhost (24-104-73-23-ip-static.hfc.comcastbusiness.net [24.104.73.23]) by mail.linuxfoundation.org (Postfix) with ESMTPSA id A9643C4D; Tue, 2 Oct 2018 13:28:06 +0000 (UTC) From: Greg Kroah-Hartman To: linux-kernel@vger.kernel.org Cc: Greg Kroah-Hartman , stable@vger.kernel.org, Daniel Vetter , Tomi Valkeinen , Laurent Pinchart , Sasha Levin Subject: [PATCH 4.18 093/228] drm/omap: gem: Fix mm_list locking Date: Tue, 2 Oct 2018 06:23:10 -0700 Message-Id: <20181002132505.637714377@linuxfoundation.org> X-Mailer: git-send-email 2.19.0 In-Reply-To: <20181002132459.032960735@linuxfoundation.org> References: <20181002132459.032960735@linuxfoundation.org> User-Agent: quilt/0.65 X-stable: review MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org 4.18-stable review patch. If anyone has any objections, please let me know. ------------------ From: Daniel Vetter [ Upstream commit 5117bd898e8c0a31e8ab3a9b8523aecf0706e997 ] - None of the list walkings where protected. - Switch to a mutex since the list walking at device resume time can sleep when pinning buffers through the tiler. Only thing we need to be careful with here is that while we walk the list we can't unreference any gem objects, since the final unref would result in a recursive deadlock. But the only functions that walk the list is the device resume and debugfs dumping, so all safe. Signed-off-by: Daniel Vetter Reviewed-by: Tomi Valkeinen Reviewed-by: Laurent Pinchart Signed-off-by: Laurent Pinchart Signed-off-by: Tomi Valkeinen Signed-off-by: Sasha Levin Signed-off-by: Greg Kroah-Hartman --- drivers/gpu/drm/omapdrm/omap_debugfs.c | 2 ++ drivers/gpu/drm/omapdrm/omap_drv.c | 2 +- drivers/gpu/drm/omapdrm/omap_drv.h | 2 +- drivers/gpu/drm/omapdrm/omap_gem.c | 15 +++++++++------ 4 files changed, 13 insertions(+), 8 deletions(-) --- a/drivers/gpu/drm/omapdrm/omap_debugfs.c +++ b/drivers/gpu/drm/omapdrm/omap_debugfs.c @@ -37,7 +37,9 @@ static int gem_show(struct seq_file *m, return ret; seq_printf(m, "All Objects:\n"); + mutex_lock(&priv->list_lock); omap_gem_describe_objects(&priv->obj_list, m); + mutex_unlock(&priv->list_lock); mutex_unlock(&dev->struct_mutex); --- a/drivers/gpu/drm/omapdrm/omap_drv.c +++ b/drivers/gpu/drm/omapdrm/omap_drv.c @@ -540,7 +540,7 @@ static int omapdrm_init(struct omap_drm_ priv->omaprev = soc ? (unsigned int)soc->data : 0; priv->wq = alloc_ordered_workqueue("omapdrm", 0); - spin_lock_init(&priv->list_lock); + mutex_init(&priv->list_lock); INIT_LIST_HEAD(&priv->obj_list); /* Allocate and initialize the DRM device. */ --- a/drivers/gpu/drm/omapdrm/omap_drv.h +++ b/drivers/gpu/drm/omapdrm/omap_drv.h @@ -71,7 +71,7 @@ struct omap_drm_private { struct workqueue_struct *wq; /* lock for obj_list below */ - spinlock_t list_lock; + struct mutex list_lock; /* list of GEM objects: */ struct list_head obj_list; --- a/drivers/gpu/drm/omapdrm/omap_gem.c +++ b/drivers/gpu/drm/omapdrm/omap_gem.c @@ -1001,6 +1001,7 @@ int omap_gem_resume(struct drm_device *d struct omap_gem_object *omap_obj; int ret = 0; + mutex_lock(&priv->list_lock); list_for_each_entry(omap_obj, &priv->obj_list, mm_list) { if (omap_obj->block) { struct drm_gem_object *obj = &omap_obj->base; @@ -1012,12 +1013,14 @@ int omap_gem_resume(struct drm_device *d omap_obj->roll, true); if (ret) { dev_err(dev->dev, "could not repin: %d\n", ret); - return ret; + goto done; } } } - return 0; +done: + mutex_unlock(&priv->list_lock); + return ret; } #endif @@ -1085,9 +1088,9 @@ void omap_gem_free_object(struct drm_gem WARN_ON(!mutex_is_locked(&dev->struct_mutex)); - spin_lock(&priv->list_lock); + mutex_lock(&priv->list_lock); list_del(&omap_obj->mm_list); - spin_unlock(&priv->list_lock); + mutex_unlock(&priv->list_lock); /* this means the object is still pinned.. which really should * not happen. I think.. @@ -1206,9 +1209,9 @@ struct drm_gem_object *omap_gem_new(stru goto err_release; } - spin_lock(&priv->list_lock); + mutex_lock(&priv->list_lock); list_add(&omap_obj->mm_list, &priv->obj_list); - spin_unlock(&priv->list_lock); + mutex_unlock(&priv->list_lock); return obj;