aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/gpu/drm/i915
diff options
context:
space:
mode:
authorMika Kuoppala <mika.kuoppala@linux.intel.com>2013-12-12 10:54:42 -0500
committerDaniel Vetter <daniel.vetter@ffwll.ch>2013-12-12 16:58:44 -0500
commit168c3f2151a7de906b060a335d19b0ba483a6718 (patch)
treea16a98d2681502b96962bdc8a4435dcae67e3a49 /drivers/gpu/drm/i915
parent993495ae992c91e98ade8fbe977c57bfd81910c1 (diff)
drm/i915: dont call irq_put when irq test is on
If test is running, irq_get was not called so we should gain balance by not doing irq_put "So the rule is: if you access unlocked values, you use ACCESS_ONCE(). You don't say "but it can't matter". Because you simply don't know." -- Linus v2: use local variable so it can't change during test (Chris) v3: update commit msg and use ACCESS_ONCE (Ville) Signed-off-by: Mika Kuoppala <mika.kuoppala@intel.com> Reviewed-by: Ville Syrjälä <ville.syrjala@linux.intel.com> Signed-off-by: Daniel Vetter <daniel.vetter@ffwll.ch>
Diffstat (limited to 'drivers/gpu/drm/i915')
-rw-r--r--drivers/gpu/drm/i915/i915_gem.c8
1 files changed, 5 insertions, 3 deletions
diff --git a/drivers/gpu/drm/i915/i915_gem.c b/drivers/gpu/drm/i915/i915_gem.c
index 279387a2fef5..e34b48e862e7 100644
--- a/drivers/gpu/drm/i915/i915_gem.c
+++ b/drivers/gpu/drm/i915/i915_gem.c
@@ -1015,6 +1015,8 @@ static int __wait_seqno(struct intel_ring_buffer *ring, u32 seqno,
1015 struct drm_i915_file_private *file_priv) 1015 struct drm_i915_file_private *file_priv)
1016{ 1016{
1017 drm_i915_private_t *dev_priv = ring->dev->dev_private; 1017 drm_i915_private_t *dev_priv = ring->dev->dev_private;
1018 const bool irq_test_in_progress =
1019 ACCESS_ONCE(dev_priv->gpu_error.test_irq_rings) & intel_ring_flag(ring);
1018 struct timespec before, now; 1020 struct timespec before, now;
1019 DEFINE_WAIT(wait); 1021 DEFINE_WAIT(wait);
1020 unsigned long timeout_expire; 1022 unsigned long timeout_expire;
@@ -1035,8 +1037,7 @@ static int __wait_seqno(struct intel_ring_buffer *ring, u32 seqno,
1035 msecs_to_jiffies(100)); 1037 msecs_to_jiffies(100));
1036 } 1038 }
1037 1039
1038 if (!(dev_priv->gpu_error.test_irq_rings & intel_ring_flag(ring)) && 1040 if (!irq_test_in_progress && WARN_ON(!ring->irq_get(ring)))
1039 WARN_ON(!ring->irq_get(ring)))
1040 return -ENODEV; 1041 return -ENODEV;
1041 1042
1042 /* Record current time in case interrupted by signal, or wedged */ 1043 /* Record current time in case interrupted by signal, or wedged */
@@ -1093,7 +1094,8 @@ static int __wait_seqno(struct intel_ring_buffer *ring, u32 seqno,
1093 getrawmonotonic(&now); 1094 getrawmonotonic(&now);
1094 trace_i915_gem_request_wait_end(ring, seqno); 1095 trace_i915_gem_request_wait_end(ring, seqno);
1095 1096
1096 ring->irq_put(ring); 1097 if (!irq_test_in_progress)
1098 ring->irq_put(ring);
1097 1099
1098 finish_wait(&ring->irq_queue, &wait); 1100 finish_wait(&ring->irq_queue, &wait);
1099 1101