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

Reply via email to