diff options
Diffstat (limited to 'recipes-kernel/linux/linux-ti33x-psp-3.2/3.2.17/0105-drm-i915-relative_constants_mode-race-fix.patch')
-rw-r--r-- | recipes-kernel/linux/linux-ti33x-psp-3.2/3.2.17/0105-drm-i915-relative_constants_mode-race-fix.patch | 78 |
1 files changed, 78 insertions, 0 deletions
diff --git a/recipes-kernel/linux/linux-ti33x-psp-3.2/3.2.17/0105-drm-i915-relative_constants_mode-race-fix.patch b/recipes-kernel/linux/linux-ti33x-psp-3.2/3.2.17/0105-drm-i915-relative_constants_mode-race-fix.patch new file mode 100644 index 00000000..e074c3b9 --- /dev/null +++ b/recipes-kernel/linux/linux-ti33x-psp-3.2/3.2.17/0105-drm-i915-relative_constants_mode-race-fix.patch | |||
@@ -0,0 +1,78 @@ | |||
1 | From c1f4cbb7a7af1e7a02e2516bd82215fd79b9edbd Mon Sep 17 00:00:00 2001 | ||
2 | From: Ben Widawsky <ben@bwidawsk.net> | ||
3 | Date: Mon, 12 Dec 2011 19:21:57 -0800 | ||
4 | Subject: [PATCH 105/165] drm/i915: relative_constants_mode race fix | ||
5 | |||
6 | commit e2971bdab2b761683353da383c0fd5ac704d1cca upstream. | ||
7 | |||
8 | dev_priv keeps track of the current addressing mode that gets set at | ||
9 | execbuffer time. Unfortunately the existing code was doing this before | ||
10 | acquiring struct_mutex which leaves a race with another thread also | ||
11 | doing an execbuffer. If that wasn't bad enough, relocate_slow drops | ||
12 | struct_mutex which opens a much more likely error where another thread | ||
13 | comes in and modifies the state while relocate_slow is being slow. | ||
14 | |||
15 | The solution here is to just defer setting this state until we | ||
16 | absolutely need it, and we know we'll have struct_mutex for the | ||
17 | remainder of our code path. | ||
18 | |||
19 | v2: Keith noticed a bug in the original patch. | ||
20 | |||
21 | Signed-off-by: Ben Widawsky <ben@bwidawsk.net> | ||
22 | Reviewed-by: Daniel Vetter <daniel.vetter@ffwll.ch> | ||
23 | Signed-off-by: Keith Packard <keithp@keithp.com> | ||
24 | Signed-off-by: Ben Hutchings <ben@decadent.org.uk> | ||
25 | --- | ||
26 | drivers/gpu/drm/i915/i915_gem_execbuffer.c | 29 +++++++++++++++------------ | ||
27 | 1 files changed, 16 insertions(+), 13 deletions(-) | ||
28 | |||
29 | diff --git a/drivers/gpu/drm/i915/i915_gem_execbuffer.c b/drivers/gpu/drm/i915/i915_gem_execbuffer.c | ||
30 | index b9da890..7d64f83 100644 | ||
31 | --- a/drivers/gpu/drm/i915/i915_gem_execbuffer.c | ||
32 | +++ b/drivers/gpu/drm/i915/i915_gem_execbuffer.c | ||
33 | @@ -1033,19 +1033,6 @@ i915_gem_do_execbuffer(struct drm_device *dev, void *data, | ||
34 | if (INTEL_INFO(dev)->gen > 5 && | ||
35 | mode == I915_EXEC_CONSTANTS_REL_SURFACE) | ||
36 | return -EINVAL; | ||
37 | - | ||
38 | - ret = intel_ring_begin(ring, 4); | ||
39 | - if (ret) | ||
40 | - return ret; | ||
41 | - | ||
42 | - intel_ring_emit(ring, MI_NOOP); | ||
43 | - intel_ring_emit(ring, MI_LOAD_REGISTER_IMM(1)); | ||
44 | - intel_ring_emit(ring, INSTPM); | ||
45 | - intel_ring_emit(ring, | ||
46 | - I915_EXEC_CONSTANTS_MASK << 16 | mode); | ||
47 | - intel_ring_advance(ring); | ||
48 | - | ||
49 | - dev_priv->relative_constants_mode = mode; | ||
50 | } | ||
51 | break; | ||
52 | default: | ||
53 | @@ -1176,6 +1163,22 @@ i915_gem_do_execbuffer(struct drm_device *dev, void *data, | ||
54 | } | ||
55 | } | ||
56 | |||
57 | + if (ring == &dev_priv->ring[RCS] && | ||
58 | + mode != dev_priv->relative_constants_mode) { | ||
59 | + ret = intel_ring_begin(ring, 4); | ||
60 | + if (ret) | ||
61 | + goto err; | ||
62 | + | ||
63 | + intel_ring_emit(ring, MI_NOOP); | ||
64 | + intel_ring_emit(ring, MI_LOAD_REGISTER_IMM(1)); | ||
65 | + intel_ring_emit(ring, INSTPM); | ||
66 | + intel_ring_emit(ring, | ||
67 | + I915_EXEC_CONSTANTS_MASK << 16 | mode); | ||
68 | + intel_ring_advance(ring); | ||
69 | + | ||
70 | + dev_priv->relative_constants_mode = mode; | ||
71 | + } | ||
72 | + | ||
73 | trace_i915_gem_ring_dispatch(ring, seqno); | ||
74 | |||
75 | exec_start = batch_obj->gtt_offset + args->batch_start_offset; | ||
76 | -- | ||
77 | 1.7.7.6 | ||
78 | |||