2016-12-02 10:50:26 +00:00
|
|
|
From 775a3408d94a474101066ac8dd8939a4cd5c793a Mon Sep 17 00:00:00 2001
|
2016-04-07 19:25:10 +00:00
|
|
|
From: Eric Anholt <eric@anholt.net>
|
|
|
|
Date: Mon, 19 Oct 2015 08:44:35 -0700
|
2016-09-10 12:54:26 +00:00
|
|
|
Subject: [PATCH] drm/vc4: Drop struct_mutex around CL validation.
|
2016-04-07 19:25:10 +00:00
|
|
|
|
|
|
|
We were using it so that we could make sure that shader validation
|
|
|
|
state didn't change while we were validating, but now shader
|
|
|
|
validation state is immutable. The bcl/rcl generation doesn't do any
|
|
|
|
other BO dereferencing, and seems to have no other global state
|
|
|
|
dependency not covered by job_lock / bo_lock.
|
|
|
|
|
|
|
|
Fixes a lock order reversal between mmap_sem and struct_mutex.
|
|
|
|
|
|
|
|
Signed-off-by: Eric Anholt <eric@anholt.net>
|
|
|
|
---
|
|
|
|
drivers/gpu/drm/vc4/vc4_gem.c | 12 ++++--------
|
|
|
|
1 file changed, 4 insertions(+), 8 deletions(-)
|
|
|
|
|
|
|
|
--- a/drivers/gpu/drm/vc4/vc4_gem.c
|
|
|
|
+++ b/drivers/gpu/drm/vc4/vc4_gem.c
|
|
|
|
@@ -244,13 +244,15 @@ static void
|
|
|
|
vc4_queue_submit(struct drm_device *dev, struct vc4_exec_info *exec)
|
|
|
|
{
|
|
|
|
struct vc4_dev *vc4 = to_vc4_dev(dev);
|
|
|
|
- uint64_t seqno = ++vc4->emit_seqno;
|
|
|
|
+ uint64_t seqno;
|
|
|
|
unsigned long irqflags;
|
|
|
|
|
|
|
|
+ spin_lock_irqsave(&vc4->job_lock, irqflags);
|
|
|
|
+
|
|
|
|
+ seqno = ++vc4->emit_seqno;
|
|
|
|
exec->seqno = seqno;
|
|
|
|
vc4_update_bo_seqnos(exec, seqno);
|
|
|
|
|
|
|
|
- spin_lock_irqsave(&vc4->job_lock, irqflags);
|
|
|
|
list_add_tail(&exec->head, &vc4->job_list);
|
|
|
|
|
|
|
|
/* If no job was executing, kick ours off. Otherwise, it'll
|
|
|
|
@@ -608,8 +610,6 @@ vc4_submit_cl_ioctl(struct drm_device *d
|
|
|
|
exec->args = args;
|
|
|
|
INIT_LIST_HEAD(&exec->unref_list);
|
|
|
|
|
|
|
|
- mutex_lock(&dev->struct_mutex);
|
|
|
|
-
|
|
|
|
ret = vc4_cl_lookup_bos(dev, file_priv, exec);
|
|
|
|
if (ret)
|
|
|
|
goto fail;
|
|
|
|
@@ -636,15 +636,11 @@ vc4_submit_cl_ioctl(struct drm_device *d
|
|
|
|
/* Return the seqno for our job. */
|
|
|
|
args->seqno = vc4->emit_seqno;
|
|
|
|
|
|
|
|
- mutex_unlock(&dev->struct_mutex);
|
|
|
|
-
|
|
|
|
return 0;
|
|
|
|
|
|
|
|
fail:
|
|
|
|
vc4_complete_exec(exec);
|
|
|
|
|
|
|
|
- mutex_unlock(&dev->struct_mutex);
|
|
|
|
-
|
|
|
|
return ret;
|
|
|
|
}
|
|
|
|
|