[Nouveau] [PATCH 2/2] pmu: be more strict about locking

Karol Herbst nouveau at karolherbst.de
Tue Mar 1 10:10:19 UTC 2016


when we start communicating with the pmu a bit more, the current code is a real
issue. I encountered a dead lock here, while testing my dynamic reclocking code

Signed-off-by: Karol Herbst <nouveau at karolherbst.de>
---
 drm/nouveau/nvkm/subdev/pmu/base.c | 8 +++++---
 1 file changed, 5 insertions(+), 3 deletions(-)

diff --git a/drm/nouveau/nvkm/subdev/pmu/base.c b/drm/nouveau/nvkm/subdev/pmu/base.c
index fa3cc5b..67d319d 100644
--- a/drm/nouveau/nvkm/subdev/pmu/base.c
+++ b/drm/nouveau/nvkm/subdev/pmu/base.c
@@ -71,21 +71,23 @@ nvkm_pmu_send(struct nvkm_pmu *pmu, u32 reply[2],
 	u32 addr;
 	int ret = 0;
 
+	mutex_lock(&subdev->mutex);
 	/* wait for a free slot in the fifo */
 	addr  = nvkm_rd32(device, 0x10a4a0);
 	if (nvkm_msec(device, 2000,
 		u32 tmp = nvkm_rd32(device, 0x10a4b0);
 		if (tmp != (addr ^ 8))
 			break;
-	) < 0)
+	) < 0) {
+		mutex_unlock(&subdev->mutex);
 		return -EBUSY;
+	}
 
 	/* we currently only support a single process at a time waiting
 	 * on a synchronous reply, take the PMU mutex and tell the
 	 * receive handler what we're waiting for
 	 */
 	if (reply) {
-		mutex_lock(&subdev->mutex);
 		pmu->recv.message = message;
 		pmu->recv.process = process;
 	}
@@ -114,9 +116,9 @@ nvkm_pmu_send(struct nvkm_pmu *pmu, u32 reply[2],
 			reply[0] = 0;
 			reply[1] = 0;
 		}
-		mutex_unlock(&subdev->mutex);
 	}
 
+	mutex_unlock(&subdev->mutex);
 	return ret;
 }
 
-- 
2.7.2



More information about the Nouveau mailing list