Passing job_lock to dma_fence_init() ties every fence to a lock embedded in vc4_dev. A fence attached to an exported BO's reservation can be held by another driver after vc4 is gone, leaving fence->lock dangling, and it pulls DRM core paths such as dma_fence_add_callback() into the lock that serialises the job queues.
Take a NULL lock in dma_fence_init() and give it a lock of its own, which is what the external lock has been deprecated in favour of. Signed-off-by: Maíra Canal <[email protected]> --- drivers/gpu/drm/vc4/vc4_gem.c | 2 +- drivers/gpu/drm/vc4/vc4_irq.c | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/drivers/gpu/drm/vc4/vc4_gem.c b/drivers/gpu/drm/vc4/vc4_gem.c index ae76868663ea..b65b3f62b098 100644 --- a/drivers/gpu/drm/vc4/vc4_gem.c +++ b/drivers/gpu/drm/vc4/vc4_gem.c @@ -632,7 +632,7 @@ vc4_queue_submit(struct drm_device *dev, struct vc4_exec_info *exec, exec->seqno = ++vc4->emit_seqno; - dma_fence_init(&fence->base, &vc4_fence_ops, &vc4->job_lock, + dma_fence_init(&fence->base, &vc4_fence_ops, NULL, vc4->dma_fence_context, exec->seqno); fence->seqno = exec->seqno; exec->fence = &fence->base; diff --git a/drivers/gpu/drm/vc4/vc4_irq.c b/drivers/gpu/drm/vc4/vc4_irq.c index 241249b6582b..f87550f3e55d 100644 --- a/drivers/gpu/drm/vc4/vc4_irq.c +++ b/drivers/gpu/drm/vc4/vc4_irq.c @@ -194,7 +194,7 @@ vc4_irq_finish_render_job(struct drm_device *dev) vc4_submit_next_bin_job(dev); if (exec->fence) - dma_fence_signal_locked(exec->fence); + dma_fence_signal(exec->fence); wake_up_all(&vc4->job_wait_queue); schedule_work(&vc4->job_done_work); -- 2.55.0
