aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/gpu
diff options
context:
space:
mode:
authorChris Wilson <chris@chris-wilson.co.uk>2016-10-07 02:53:24 -0400
committerJani Nikula <jani.nikula@intel.com>2016-10-10 09:06:43 -0400
commit9b05a6099ed67c2a92e7e5d9032536f1c08169a6 (patch)
treef41e0dd5e560968d5574b9596fdf2d0d669a42eb /drivers/gpu
parent16c83fad79ca912b8b5bbdcb5272794a2be41262 (diff)
drm/i915: Distinguish last emitted request from last submitted request
In order not to trigger hangcheck on a idle-but-waiting engine, we need to distinguish between the pending request queue and the actual execution queue. This is done later in "drm/i915: Enable multiple timelines" but for now we need a temporary fix to prevent blaming the wrong engine for a GPU hang. (Note that this causes a temporary subtle change in how we decide when to allow a waitboost to be re-awarded back to the waiter, the temporary effect is that if the wait is upon the most current execution the wait is given for free, instead of checking to see if the client stalled itself. This will be repaired in "drm/i915: Enable multiple timelines".) Fixes: 0a046a0e93d2 ("drm/i915: Nonblocking request submission") Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=98104 Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk> Cc: Joonas Lahtinen <joonas.lahtinen@linux.intel.com> Cc: Mika Kuoppala <mika.kuoppala@intel.com> Reviewed-by: Joonas Lahtinen <joonas.lahtinen@linux.intel.com> Reviewed-by: Mika Kuoppala <mika.kuoppala@intel.com> Link: http://patchwork.freedesktop.org/patch/msgid/20161007065327.24515-1-chris@chris-wilson.co.uk (cherry picked from commit 8687b3ec852e89630bac650f15136811c7b4c1dc) Signed-off-by: Jani Nikula <jani.nikula@intel.com>
Diffstat (limited to 'drivers/gpu')
-rw-r--r--drivers/gpu/drm/i915/i915_gem_request.c5
-rw-r--r--drivers/gpu/drm/i915/intel_ringbuffer.h1
2 files changed, 4 insertions, 2 deletions
diff --git a/drivers/gpu/drm/i915/i915_gem_request.c b/drivers/gpu/drm/i915/i915_gem_request.c
index 40978bc12ceb..8832f8ec1583 100644
--- a/drivers/gpu/drm/i915/i915_gem_request.c
+++ b/drivers/gpu/drm/i915/i915_gem_request.c
@@ -328,6 +328,7 @@ submit_notify(struct i915_sw_fence *fence, enum i915_sw_fence_notify state)
328 328
329 switch (state) { 329 switch (state) {
330 case FENCE_COMPLETE: 330 case FENCE_COMPLETE:
331 request->engine->last_submitted_seqno = request->fence.seqno;
331 request->engine->submit_request(request); 332 request->engine->submit_request(request);
332 break; 333 break;
333 334
@@ -641,8 +642,8 @@ void __i915_add_request(struct drm_i915_gem_request *request, bool flush_caches)
641 &request->submitq); 642 &request->submitq);
642 643
643 request->emitted_jiffies = jiffies; 644 request->emitted_jiffies = jiffies;
644 request->previous_seqno = engine->last_submitted_seqno; 645 request->previous_seqno = engine->last_pending_seqno;
645 engine->last_submitted_seqno = request->fence.seqno; 646 engine->last_pending_seqno = request->fence.seqno;
646 i915_gem_active_set(&engine->last_request, request); 647 i915_gem_active_set(&engine->last_request, request);
647 list_add_tail(&request->link, &engine->request_list); 648 list_add_tail(&request->link, &engine->request_list);
648 list_add_tail(&request->ring_link, &ring->request_list); 649 list_add_tail(&request->ring_link, &ring->request_list);
diff --git a/drivers/gpu/drm/i915/intel_ringbuffer.h b/drivers/gpu/drm/i915/intel_ringbuffer.h
index 7f64d611159b..1d8de09ec535 100644
--- a/drivers/gpu/drm/i915/intel_ringbuffer.h
+++ b/drivers/gpu/drm/i915/intel_ringbuffer.h
@@ -328,6 +328,7 @@ struct intel_engine_cs {
328 * inspecting request list. 328 * inspecting request list.
329 */ 329 */
330 u32 last_submitted_seqno; 330 u32 last_submitted_seqno;
331 u32 last_pending_seqno;
331 332
332 /* An RCU guarded pointer to the last request. No reference is 333 /* An RCU guarded pointer to the last request. No reference is
333 * held to the request, users must carefully acquire a reference to 334 * held to the request, users must carefully acquire a reference to