[Intel-gfx] [PATCH 2/2] drm/i915: Don't dereference request if it may have been retired
Tvrtko Ursulin
tvrtko.ursulin at linux.intel.com
Tue Jun 18 16:58:02 UTC 2019
On 18/06/2019 17:19, Chris Wilson wrote:
> This has count me out on countless occasions, when we retrieve a pointer
> from the submission/execlists backend, it does not carry a reference to
> the context or ring. Those are only pinned while the rquest is active,
> so if we see the request is completed, it may be in the process of being
> retired and those pointers defunct.
>
> Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=110938
> Signed-off-by: Chris Wilson <chris at chris-wilson.co.uk>
> ---
> drivers/gpu/drm/i915/gt/intel_engine_cs.c | 16 +++++++++-------
> 1 file changed, 9 insertions(+), 7 deletions(-)
>
> diff --git a/drivers/gpu/drm/i915/gt/intel_engine_cs.c b/drivers/gpu/drm/i915/gt/intel_engine_cs.c
> index 898692989313..7fd33e81c2d9 100644
> --- a/drivers/gpu/drm/i915/gt/intel_engine_cs.c
> +++ b/drivers/gpu/drm/i915/gt/intel_engine_cs.c
> @@ -1311,12 +1311,13 @@ static void hexdump(struct drm_printer *m, const void *buf, size_t len)
> }
> }
>
> -static void intel_engine_print_registers(const struct intel_engine_cs *engine,
> +static void intel_engine_print_registers(struct intel_engine_cs *engine,
> struct drm_printer *m)
> {
> struct drm_i915_private *dev_priv = engine->i915;
> const struct intel_engine_execlists * const execlists =
> &engine->execlists;
> + unsigned long flags;
> u64 addr;
>
> if (engine->id == RCS0 && IS_GEN_RANGE(dev_priv, 4, 7))
> @@ -1397,15 +1398,16 @@ static void intel_engine_print_registers(const struct intel_engine_cs *engine,
> idx, hws[idx * 2], hws[idx * 2 + 1]);
> }
>
> - rcu_read_lock();
> + spin_lock_irqsave(&engine->active.lock, flags);
> for (idx = 0; idx < execlists_num_ports(execlists); idx++) {
> struct i915_request *rq;
> unsigned int count;
> + char hdr[80];
>
> rq = port_unpack(&execlists->port[idx], &count);
> - if (rq) {
> - char hdr[80];
> -
> + if (!rq) {
> + drm_printf(m, "\t\tELSP[%d] idle\n", idx);
> + } else if (!i915_request_signaled(rq)) {
> snprintf(hdr, sizeof(hdr),
> "\t\tELSP[%d] count=%d, ring:{start:%08x, hwsp:%08x, seqno:%08x}, rq: ",
> idx, count,
> @@ -1414,11 +1416,11 @@ static void intel_engine_print_registers(const struct intel_engine_cs *engine,
> hwsp_seqno(rq));
> print_request(m, rq, hdr);
> } else {
> - drm_printf(m, "\t\tELSP[%d] idle\n", idx);
> + print_request(m, rq, "\t\tELSP[%d] rq: ");
> }
> }
> drm_printf(m, "\t\tHW active? 0x%x\n", execlists->active);
> - rcu_read_unlock();
> + spin_unlock_irqrestore(&engine->active.lock, flags);
> } else if (INTEL_GEN(dev_priv) > 6) {
> drm_printf(m, "\tPP_DIR_BASE: 0x%08x\n",
> ENGINE_READ(engine, RING_PP_DIR_BASE));
>
Reviewed-by: Tvrtko Ursulin <tvrtko.ursulin at intel.com>
Regards,
Tvrtko
More information about the Intel-gfx
mailing list