Message ID | 20180502075416.14614-1-chris@chris-wilson.co.uk (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
Chris Wilson <chris@chris-wilson.co.uk> writes: > Since the advent of execlists, the HW no longer executes from a single > statically assigned ring, but instead switches to a different ring for > each context (logical ringbuffer contexts as it is called). So a good way > to tally the executing context against what we have queued is by > comparing the RING_START register against our requests. Make it so. > > Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk> > Cc: Mika Kuoppala <mika.kuoppala@linux.intel.com> Reviewed-by: Mika Kuoppala <mika.kuoppala@linux.intel.com> > --- > drivers/gpu/drm/i915/i915_gpu_error.c | 5 +++-- > drivers/gpu/drm/i915/i915_gpu_error.h | 1 + > drivers/gpu/drm/i915/intel_engine_cs.c | 5 +++-- > 3 files changed, 7 insertions(+), 4 deletions(-) > > diff --git a/drivers/gpu/drm/i915/i915_gpu_error.c b/drivers/gpu/drm/i915/i915_gpu_error.c > index c0127965b578..3c5a47cbd12d 100644 > --- a/drivers/gpu/drm/i915/i915_gpu_error.c > +++ b/drivers/gpu/drm/i915/i915_gpu_error.c > @@ -409,11 +409,11 @@ static void error_print_request(struct drm_i915_error_state_buf *m, > if (!erq->seqno) > return; > > - err_printf(m, "%s pid %d, ban score %d, seqno %8x:%08x, prio %d, emitted %dms ago, head %08x, tail %08x\n", > + err_printf(m, "%s pid %d, ban score %d, seqno %8x:%08x, prio %d, emitted %dms ago, start %08x, head %08x, tail %08x\n", > prefix, erq->pid, erq->ban_score, > erq->context, erq->seqno, erq->sched_attr.priority, > jiffies_to_msecs(jiffies - erq->jiffies), > - erq->head, erq->tail); > + erq->start, erq->head, erq->tail); > } > > static void error_print_context(struct drm_i915_error_state_buf *m, > @@ -1282,6 +1282,7 @@ static void record_request(struct i915_request *request, > erq->ban_score = atomic_read(&request->ctx->ban_score); > erq->seqno = request->global_seqno; > erq->jiffies = request->emitted_jiffies; > + erq->start = i915_ggtt_offset(request->ring->vma); > erq->head = request->head; > erq->tail = request->tail; > > diff --git a/drivers/gpu/drm/i915/i915_gpu_error.h b/drivers/gpu/drm/i915/i915_gpu_error.h > index 5d6fdcbc092c..ad7c2328b31c 100644 > --- a/drivers/gpu/drm/i915/i915_gpu_error.h > +++ b/drivers/gpu/drm/i915/i915_gpu_error.h > @@ -150,6 +150,7 @@ struct i915_gpu_state { > u32 context; > int ban_score; > u32 seqno; > + u32 start; > u32 head; > u32 tail; > struct i915_sched_attr sched_attr; > diff --git a/drivers/gpu/drm/i915/intel_engine_cs.c b/drivers/gpu/drm/i915/intel_engine_cs.c > index 238c8d3da041..9164e6d665f8 100644 > --- a/drivers/gpu/drm/i915/intel_engine_cs.c > +++ b/drivers/gpu/drm/i915/intel_engine_cs.c > @@ -1278,8 +1278,9 @@ static void intel_engine_print_registers(const struct intel_engine_cs *engine, > char hdr[80]; > > snprintf(hdr, sizeof(hdr), > - "\t\tELSP[%d] count=%d, rq: ", > - idx, count); > + "\t\tELSP[%d] count=%d, ring->start=%08x, rq: ", > + idx, count, > + i915_ggtt_offset(rq->ring->vma)); > print_request(m, rq, hdr); > } else { > drm_printf(m, "\t\tELSP[%d] idle\n", idx); > -- > 2.17.0
Quoting Mika Kuoppala (2018-05-02 10:29:35) > Chris Wilson <chris@chris-wilson.co.uk> writes: > > > Since the advent of execlists, the HW no longer executes from a single > > statically assigned ring, but instead switches to a different ring for > > each context (logical ringbuffer contexts as it is called). So a good way > > to tally the executing context against what we have queued is by > > comparing the RING_START register against our requests. Make it so. > > > > Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk> > > Cc: Mika Kuoppala <mika.kuoppala@linux.intel.com> > > Reviewed-by: Mika Kuoppala <mika.kuoppala@linux.intel.com> Pushed, thanks for the review. -Chris
diff --git a/drivers/gpu/drm/i915/i915_gpu_error.c b/drivers/gpu/drm/i915/i915_gpu_error.c index c0127965b578..3c5a47cbd12d 100644 --- a/drivers/gpu/drm/i915/i915_gpu_error.c +++ b/drivers/gpu/drm/i915/i915_gpu_error.c @@ -409,11 +409,11 @@ static void error_print_request(struct drm_i915_error_state_buf *m, if (!erq->seqno) return; - err_printf(m, "%s pid %d, ban score %d, seqno %8x:%08x, prio %d, emitted %dms ago, head %08x, tail %08x\n", + err_printf(m, "%s pid %d, ban score %d, seqno %8x:%08x, prio %d, emitted %dms ago, start %08x, head %08x, tail %08x\n", prefix, erq->pid, erq->ban_score, erq->context, erq->seqno, erq->sched_attr.priority, jiffies_to_msecs(jiffies - erq->jiffies), - erq->head, erq->tail); + erq->start, erq->head, erq->tail); } static void error_print_context(struct drm_i915_error_state_buf *m, @@ -1282,6 +1282,7 @@ static void record_request(struct i915_request *request, erq->ban_score = atomic_read(&request->ctx->ban_score); erq->seqno = request->global_seqno; erq->jiffies = request->emitted_jiffies; + erq->start = i915_ggtt_offset(request->ring->vma); erq->head = request->head; erq->tail = request->tail; diff --git a/drivers/gpu/drm/i915/i915_gpu_error.h b/drivers/gpu/drm/i915/i915_gpu_error.h index 5d6fdcbc092c..ad7c2328b31c 100644 --- a/drivers/gpu/drm/i915/i915_gpu_error.h +++ b/drivers/gpu/drm/i915/i915_gpu_error.h @@ -150,6 +150,7 @@ struct i915_gpu_state { u32 context; int ban_score; u32 seqno; + u32 start; u32 head; u32 tail; struct i915_sched_attr sched_attr; diff --git a/drivers/gpu/drm/i915/intel_engine_cs.c b/drivers/gpu/drm/i915/intel_engine_cs.c index 238c8d3da041..9164e6d665f8 100644 --- a/drivers/gpu/drm/i915/intel_engine_cs.c +++ b/drivers/gpu/drm/i915/intel_engine_cs.c @@ -1278,8 +1278,9 @@ static void intel_engine_print_registers(const struct intel_engine_cs *engine, char hdr[80]; snprintf(hdr, sizeof(hdr), - "\t\tELSP[%d] count=%d, rq: ", - idx, count); + "\t\tELSP[%d] count=%d, ring->start=%08x, rq: ", + idx, count, + i915_ggtt_offset(rq->ring->vma)); print_request(m, rq, hdr); } else { drm_printf(m, "\t\tELSP[%d] idle\n", idx);
Since the advent of execlists, the HW no longer executes from a single statically assigned ring, but instead switches to a different ring for each context (logical ringbuffer contexts as it is called). So a good way to tally the executing context against what we have queued is by comparing the RING_START register against our requests. Make it so. Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk> Cc: Mika Kuoppala <mika.kuoppala@linux.intel.com> --- drivers/gpu/drm/i915/i915_gpu_error.c | 5 +++-- drivers/gpu/drm/i915/i915_gpu_error.h | 1 + drivers/gpu/drm/i915/intel_engine_cs.c | 5 +++-- 3 files changed, 7 insertions(+), 4 deletions(-)