[Intel-gfx] [PATCH v2] drm/i915/execlists: Always clear ring_pause if we do not submit

Mika Kuoppala mika.kuoppala at linux.intel.com
Mon Jun 24 10:25:01 UTC 2019


Chris Wilson <chris at chris-wilson.co.uk> writes:

> In the unlikely case (thank you CI!), we may find ourselves wanting to
> issue a preemption but having no runnable requests left. In this case,
> we set the semaphore before computing the preemption and so must unset
> it before forgetting (or else we leave the machine busywaiting until the
> next request comes along and so likely hang).
>
> v2: Replace readback with only a wmb after asserting the semaphore
>
> Signed-off-by: Chris Wilson <chris at chris-wilson.co.uk>
> Cc: Mika Kuoppala <mika.kuoppala at linux.intel.com>

Reviewed-by: Mika Kuoppala <mika.kuoppala at linux.intel.com>

> ---
>  drivers/gpu/drm/i915/gt/intel_lrc.c | 5 ++++-
>  1 file changed, 4 insertions(+), 1 deletion(-)
>
> diff --git a/drivers/gpu/drm/i915/gt/intel_lrc.c b/drivers/gpu/drm/i915/gt/intel_lrc.c
> index 8017efb36f7b..a392186ca40b 100644
> --- a/drivers/gpu/drm/i915/gt/intel_lrc.c
> +++ b/drivers/gpu/drm/i915/gt/intel_lrc.c
> @@ -240,7 +240,8 @@ ring_set_paused(const struct intel_engine_cs *engine, int state)
>  	 * until the dword is false.
>  	 */
>  	engine->status_page.addr[I915_GEM_HWS_PREEMPT] = state;
> -	wmb();
> +	if (state)
> +		wmb();
>  }
>  
>  static inline struct i915_priolist *to_priolist(struct rb_node *rb)
> @@ -1249,6 +1250,8 @@ static void execlists_dequeue(struct intel_engine_cs *engine)
>  		*port = execlists_schedule_in(last, port - execlists->pending);
>  		memset(port + 1, 0, (last_port - port) * sizeof(*port));
>  		execlists_submit_ports(engine);
> +	} else {
> +		ring_set_paused(engine, 0);
>  	}
>  }
>  
> -- 
> 2.20.1


More information about the Intel-gfx mailing list