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 <[email protected]>
---
 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

_______________________________________________
Nouveau mailing list
[email protected]
https://lists.freedesktop.org/mailman/listinfo/nouveau

Reply via email to