openwrt/target/linux/brcm2708/patches-4.4/0095-drm-vc4-Drop-struct_mutex-around-CL-validation.patch
Álvaro Fernández Rojas 2b1c6b21b5 brcm2708: update linux 4.4 patches to latest version
As usual these patches were extracted and rebased from the raspberry pi repo:
https://github.com/raspberrypi/linux/tree/rpi-4.4.y

Also adds support for Raspberry Pi Compute Module 3 (untested).

Signed-off-by: Álvaro Fernández Rojas <noltari@gmail.com>
2016-09-10 14:54:26 +02:00

64 lines
1.8 KiB
Diff

From 72634a2adb667d991249e66e691878cd7e7722a0 Mon Sep 17 00:00:00 2001
From: Eric Anholt <eric@anholt.net>
Date: Mon, 19 Oct 2015 08:44:35 -0700
Subject: [PATCH] drm/vc4: Drop struct_mutex around CL validation.
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;
}