| From 917e9b7c2350e3e53162fcf5035e5f2d68e2cbed Mon Sep 17 00:00:00 2001 |
| From: Rob Clark <robdclark@chromium.org> |
| Date: Tue, 9 Jan 2024 10:22:17 -0800 |
| Subject: Revert "drm/msm/gpu: Push gpu lock down past runpm" |
| |
| From: Rob Clark <robdclark@chromium.org> |
| |
| commit 917e9b7c2350e3e53162fcf5035e5f2d68e2cbed upstream. |
| |
| This reverts commit abe2023b4cea192ab266b351fd38dc9dbd846df0. |
| |
| Changing the locking order means that scheduler/msm_job_run() can race |
| with the recovery kthread worker, with the result that the GPU gets an |
| extra runpm get when we are trying to power it off. Leaving the GPU in |
| an unrecovered state. |
| |
| I'll need to come up with a different scheme for appeasing lockdep. |
| |
| Signed-off-by: Rob Clark <robdclark@chromium.org> |
| Patchwork: https://patchwork.freedesktop.org/patch/573835/ |
| Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> |
| --- |
| drivers/gpu/drm/msm/msm_gpu.c | 11 +++++------ |
| drivers/gpu/drm/msm/msm_ringbuffer.c | 7 +++++-- |
| 2 files changed, 10 insertions(+), 8 deletions(-) |
| |
| --- a/drivers/gpu/drm/msm/msm_gpu.c |
| +++ b/drivers/gpu/drm/msm/msm_gpu.c |
| @@ -749,12 +749,14 @@ void msm_gpu_submit(struct msm_gpu *gpu, |
| struct msm_ringbuffer *ring = submit->ring; |
| unsigned long flags; |
| |
| - pm_runtime_get_sync(&gpu->pdev->dev); |
| + WARN_ON(!mutex_is_locked(&gpu->lock)); |
| |
| - mutex_lock(&gpu->lock); |
| + pm_runtime_get_sync(&gpu->pdev->dev); |
| |
| msm_gpu_hw_init(gpu); |
| |
| + submit->seqno = submit->hw_fence->seqno; |
| + |
| update_sw_cntrs(gpu); |
| |
| /* |
| @@ -779,11 +781,8 @@ void msm_gpu_submit(struct msm_gpu *gpu, |
| gpu->funcs->submit(gpu, submit); |
| gpu->cur_ctx_seqno = submit->queue->ctx->seqno; |
| |
| - hangcheck_timer_reset(gpu); |
| - |
| - mutex_unlock(&gpu->lock); |
| - |
| pm_runtime_put(&gpu->pdev->dev); |
| + hangcheck_timer_reset(gpu); |
| } |
| |
| /* |
| --- a/drivers/gpu/drm/msm/msm_ringbuffer.c |
| +++ b/drivers/gpu/drm/msm/msm_ringbuffer.c |
| @@ -21,8 +21,6 @@ static struct dma_fence *msm_job_run(str |
| |
| msm_fence_init(submit->hw_fence, fctx); |
| |
| - submit->seqno = submit->hw_fence->seqno; |
| - |
| mutex_lock(&priv->lru.lock); |
| |
| for (i = 0; i < submit->nr_bos; i++) { |
| @@ -34,8 +32,13 @@ static struct dma_fence *msm_job_run(str |
| |
| mutex_unlock(&priv->lru.lock); |
| |
| + /* TODO move submit path over to using a per-ring lock.. */ |
| + mutex_lock(&gpu->lock); |
| + |
| msm_gpu_submit(gpu, submit); |
| |
| + mutex_unlock(&gpu->lock); |
| + |
| return dma_fence_get(submit->hw_fence); |
| } |
| |