diff options
author | Eric Anholt <eric@anholt.net> | 2015-05-27 16:30:18 -0700 |
---|---|---|
committer | Eric Anholt <eric@anholt.net> | 2015-06-04 14:15:37 -0700 |
commit | 31831905d175291d9c2c504c89ba167b327ee939 (patch) | |
tree | 25d09dd117d6607b7aa55d63dbc261f56c562932 | |
parent | c142c62b580d988adf2baa40e5f09302f3a0f9d9 (diff) | |
download | linux-31831905d175291d9c2c504c89ba167b327ee939.tar.gz |
drm/vc4: Don't forget to irqsave/restore in the reset path.
Fixes another deadlock error from lockdep.
Signed-off-by: Eric Anholt <eric@anholt.net>
-rw-r--r-- | drivers/gpu/drm/vc4/vc4_irq.c | 12 |
1 files changed, 6 insertions, 6 deletions
diff --git a/drivers/gpu/drm/vc4/vc4_irq.c b/drivers/gpu/drm/vc4/vc4_irq.c index df9c4c86fa34..b5a1a273f83f 100644 --- a/drivers/gpu/drm/vc4/vc4_irq.c +++ b/drivers/gpu/drm/vc4/vc4_irq.c @@ -88,18 +88,13 @@ vc4_irq_finish_job(struct drm_device *dev) struct vc4_dev *vc4 = to_vc4_dev(dev); struct vc4_exec_info *exec = vc4_first_job(vc4); - spin_lock(&vc4->job_lock); - if (!exec) { - spin_unlock(&vc4->job_lock); + if (!exec) return; - } vc4->finished_seqno++; list_move_tail(&exec->head, &vc4->job_done_list); vc4_submit_next_job(dev); - spin_unlock(&vc4->job_lock); - wake_up_all(&vc4->job_wait_queue); schedule_work(&vc4->job_done_work); } @@ -123,7 +118,9 @@ vc4_irq(int irq, void *arg) } if (intctl & V3D_INT_FRDONE) { + spin_lock(&vc4->job_lock); vc4_irq_finish_job(dev); + spin_unlock(&vc4->job_lock); status = IRQ_HANDLED; } @@ -180,10 +177,13 @@ vc4_irq_uninstall(struct drm_device *dev) void vc4_irq_reset(struct drm_device *dev) { struct vc4_dev *vc4 = to_vc4_dev(dev); + unsigned long irqflags; V3D_WRITE(V3D_INTCTL, V3D_DRIVER_IRQS); V3D_WRITE(V3D_INTDIS, 0); V3D_WRITE(V3D_INTENA, V3D_DRIVER_IRQS); + spin_lock_irqsave(&vc4->job_lock, irqflags); vc4_irq_finish_job(dev); + spin_unlock_irqrestore(&vc4->job_lock, irqflags); } |