All of lore.kernel.org
 help / color / mirror / Atom feed
From: Maarten Lankhorst <maarten.lankhorst@canonical.com>
To: Ben Skeggs <bskeggs@redhat.com>
Cc: "nouveau@lists.freedesktop.org" <nouveau@lists.freedesktop.org>,
	"dri-devel@lists.freedesktop.org"
	<dri-devel@lists.freedesktop.org>
Subject: [PATCH 2/2] drm/nouveau: require cli->mutex in RING_SPACE
Date: Tue, 14 Jan 2014 16:52:35 +0100	[thread overview]
Message-ID: <52D55D43.4070805@canonical.com> (raw)
In-Reply-To: <52D55C6A.80804@canonical.com>

There are some cases where it's fine to not hold the cli->mutex, but in those cases we
are the only caller and we should really be able to acquire cli->mutex without blocking.

This patch will prevent future occurrences where commands are sent to a channel without
proper locking.

Signed-off-by: Maarten Lankhorst<maarten.lankhorst@canonical.com>
---
diff --git a/drivers/gpu/drm/nouveau/nouveau_abi16.c b/drivers/gpu/drm/nouveau/nouveau_abi16.c
index 900fae01793e..20959e445d05 100644
--- a/drivers/gpu/drm/nouveau/nouveau_abi16.c
+++ b/drivers/gpu/drm/nouveau/nouveau_abi16.c
@@ -153,10 +153,12 @@ nouveau_abi16_fini(struct nouveau_abi16 *abi16)
  	struct nouveau_cli *cli = (void *)abi16->client;
  	struct nouveau_abi16_chan *chan, *temp;
  
+	mutex_lock(&cli->mutex);
  	/* cleanup channels */
  	list_for_each_entry_safe(chan, temp, &abi16->channels, head) {
  		nouveau_abi16_chan_fini(abi16, chan);
  	}
+	mutex_unlock(&cli->mutex);
  
  	/* destroy the device object */
  	nouveau_object_del(abi16->client, NVDRM_CLIENT, NVDRM_DEVICE);
diff --git a/drivers/gpu/drm/nouveau/nouveau_dma.h b/drivers/gpu/drm/nouveau/nouveau_dma.h
index 984004d66a6d..82465bd0b59b 100644
--- a/drivers/gpu/drm/nouveau/nouveau_dma.h
+++ b/drivers/gpu/drm/nouveau/nouveau_dma.h
@@ -107,6 +107,7 @@ RING_SPACE(struct nouveau_channel *chan, int size)
  {
  	int ret;
  
+	lockdep_assert_held(&chan->cli->mutex);
  	ret = nouveau_dma_wait(chan, 1, size);
  	if (ret)
  		return ret;
diff --git a/drivers/gpu/drm/nouveau/nouveau_drm.c b/drivers/gpu/drm/nouveau/nouveau_drm.c
index f7a6568cfa6a..a60c404d59e4 100644
--- a/drivers/gpu/drm/nouveau/nouveau_drm.c
+++ b/drivers/gpu/drm/nouveau/nouveau_drm.c
@@ -476,7 +476,9 @@ nouveau_drm_load(struct drm_device *dev, unsigned long flags)
  
  	nouveau_sysfs_init(dev);
  	nouveau_hwmon_init(dev);
+	mutex_lock(&drm->client.mutex);
  	nouveau_accel_init(drm);
+	mutex_unlock(&drm->client.mutex);
  	nouveau_fbcon_init(dev);
  
  	if (nouveau_runtime_pm != 0) {
@@ -562,17 +564,17 @@ nouveau_do_suspend(struct drm_device *dev)
  	ttm_bo_evict_mm(&drm->ttm.bdev, TTM_PL_VRAM);
  
  	NV_INFO(drm, "waiting for kernel channels to go idle...\n");
-	if (drm->cechan) {
+	ret = 0;
+	mutex_lock(&drm->client.mutex);
+	if (drm->cechan)
  		ret = nouveau_channel_idle(drm->cechan);
-		if (ret)
-			return ret;
-	}
  
-	if (drm->channel) {
+	if (drm->channel && !ret)
  		ret = nouveau_channel_idle(drm->channel);
-		if (ret)
-			return ret;
-	}
+	mutex_unlock(&drm->client.mutex);
+	if (ret)
+		return ret;
+
  
  	NV_INFO(drm, "suspending client object trees...\n");
  	if (drm->fence && nouveau_fence(drm)->suspend) {
diff --git a/drivers/gpu/drm/nouveau/nouveau_fbcon.c b/drivers/gpu/drm/nouveau/nouveau_fbcon.c
index 7903e0ed3c75..aec87e1d3855 100644
--- a/drivers/gpu/drm/nouveau/nouveau_fbcon.c
+++ b/drivers/gpu/drm/nouveau/nouveau_fbcon.c
@@ -357,7 +357,7 @@ nouveau_fbcon_create(struct drm_fb_helper *helper,
  
  	mutex_unlock(&dev->struct_mutex);
  
-	if (chan) {
+	if (chan && !WARN_ON(!mutex_trylock(&drm->client.mutex))) {
  		ret = -ENODEV;
  		if (device->card_type < NV_50)
  			ret = nv04_fbcon_accel_init(info);
@@ -366,6 +366,7 @@ nouveau_fbcon_create(struct drm_fb_helper *helper,
  			ret = nv50_fbcon_accel_init(info);
  		else
  			ret = nvc0_fbcon_accel_init(info);
+		mutex_unlock(&drm->client.mutex);
  
  		if (ret == 0)
  			info->fbops = &nouveau_fbcon_ops;

      reply	other threads:[~2014-01-14 15:52 UTC|newest]

Thread overview: 2+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2014-01-14 15:48 [PATCH 1/2] drm/nouveau: hold mutex while syncing to kernel channel Maarten Lankhorst
2014-01-14 15:52 ` Maarten Lankhorst [this message]

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=52D55D43.4070805@canonical.com \
    --to=maarten.lankhorst@canonical.com \
    --cc=bskeggs@redhat.com \
    --cc=dri-devel@lists.freedesktop.org \
    --cc=nouveau@lists.freedesktop.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.