[Intel-gfx] [PATCH] drm/i915: Store preemption capability in engine->flags

Daniele Ceraolo Spurio daniele.ceraolospurio at intel.com
Mon Apr 2 16:15:51 UTC 2018



On 31/03/18 03:42, Chris Wilson wrote:
> Let's avoid having to delve down the pointer chain to see if the i915
> device has support for preemption and store that on the engine, which
> made the decision in the first place!
> 
> Signed-off-by: Chris Wilson <chris at chris-wilson.co.uk>
> Cc: Tomasz Lis <tomasz.lis at intel.com>
> Cc: Daniele Ceraolo Spurio <daniele.ceraolospurio at intel.com>
> Cc: MichaƂ Winiarski <michal.winiarski at intel.com>
> Cc: Tvrtko Ursulin <tvrtko.ursulin at intel.com>
> ---
>   drivers/gpu/drm/i915/intel_lrc.c        |  7 +++++--
>   drivers/gpu/drm/i915/intel_ringbuffer.h | 13 +++++++++++--
>   2 files changed, 16 insertions(+), 4 deletions(-)
> 
> diff --git a/drivers/gpu/drm/i915/intel_lrc.c b/drivers/gpu/drm/i915/intel_lrc.c
> index f60b61bf8b3b..48073987214f 100644
> --- a/drivers/gpu/drm/i915/intel_lrc.c
> +++ b/drivers/gpu/drm/i915/intel_lrc.c
> @@ -183,7 +183,8 @@ static inline bool need_preempt(const struct intel_engine_cs *engine,
>   				const struct i915_request *last,
>   				int prio)
>   {
> -	return engine->i915->preempt_context && prio > max(rq_prio(last), 0);
> +	return (intel_engine_has_preemption(engine) &&
> +		prio > max(rq_prio(last), 0));

This is re-coded in guc_dequeue so we could either use 
intel_engine_has_preemption() over there as well or move
need_preempt() to a common header and call it from there. Apart from 
this the patch LGTM.

Daniele

>   }
>   
>   /**
> @@ -2089,11 +2090,13 @@ static void execlists_set_default_submission(struct intel_engine_cs *engine)
>   	engine->unpark = NULL;
>   
>   	engine->flags |= I915_ENGINE_SUPPORTS_STATS;
> +	if (engine->i915->preempt_context)
> +		engine->flags |= I915_ENGINE_HAS_PREEMPTION;
>   
>   	engine->i915->caps.scheduler =
>   		I915_SCHEDULER_CAP_ENABLED |
>   		I915_SCHEDULER_CAP_PRIORITY;
> -	if (engine->i915->preempt_context)
> +	if (intel_engine_has_preemption(engine))
>   		engine->i915->caps.scheduler |= I915_SCHEDULER_CAP_PREEMPTION;
>   }
>   
> diff --git a/drivers/gpu/drm/i915/intel_ringbuffer.h b/drivers/gpu/drm/i915/intel_ringbuffer.h
> index a02c7b3b9d55..1079254e6b89 100644
> --- a/drivers/gpu/drm/i915/intel_ringbuffer.h
> +++ b/drivers/gpu/drm/i915/intel_ringbuffer.h
> @@ -562,6 +562,7 @@ struct intel_engine_cs {
>   
>   #define I915_ENGINE_NEEDS_CMD_PARSER BIT(0)
>   #define I915_ENGINE_SUPPORTS_STATS   BIT(1)
> +#define I915_ENGINE_HAS_PREEMPTION   BIT(2)
>   	unsigned int flags;
>   
>   	/*
> @@ -621,16 +622,24 @@ struct intel_engine_cs {
>   	} stats;
>   };
>   
> -static inline bool intel_engine_needs_cmd_parser(struct intel_engine_cs *engine)
> +static inline bool
> +intel_engine_needs_cmd_parser(const struct intel_engine_cs *engine)
>   {
>   	return engine->flags & I915_ENGINE_NEEDS_CMD_PARSER;
>   }
>   
> -static inline bool intel_engine_supports_stats(struct intel_engine_cs *engine)
> +static inline bool
> +intel_engine_supports_stats(const struct intel_engine_cs *engine)
>   {
>   	return engine->flags & I915_ENGINE_SUPPORTS_STATS;
>   }
>   
> +static inline bool
> +intel_engine_has_preemption(const struct intel_engine_cs *engine)
> +{
> +	return engine->flags & I915_ENGINE_HAS_PREEMPTION;
> +}
> +
>   static inline void
>   execlists_set_active(struct intel_engine_execlists *execlists,
>   		     unsigned int bit)
> 


More information about the Intel-gfx mailing list