diff options
author | Mika Kuoppala <mika.kuoppala@linux.intel.com> | 2013-12-12 10:54:42 -0500 |
---|---|---|
committer | Daniel Vetter <daniel.vetter@ffwll.ch> | 2013-12-12 16:58:44 -0500 |
commit | 168c3f2151a7de906b060a335d19b0ba483a6718 (patch) | |
tree | a16a98d2681502b96962bdc8a4435dcae67e3a49 /drivers/gpu/drm/i915 | |
parent | 993495ae992c91e98ade8fbe977c57bfd81910c1 (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.c | 8 |
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 | ||