[Intel-gfx] [PATCH 3/6] drm/i915/guc: Remove GuC wq reservation

Daniele Ceraolo Spurio daniele.ceraolospurio at intel.com
Thu May 18 21:40:38 UTC 2017


<snip>

>
>  static void nested_enable_signaling(struct drm_i915_gem_request *rq)
> @@ -1223,6 +1155,9 @@ int i915_guc_submission_enable(struct drm_i915_private *dev_priv)
>  	enum intel_engine_id id;
>  	int err;
>
> +	BUILD_BUG_ON(ARRAY_SIZE(engine->execlist_port) *
> +		     sizeof(struct guc_wq_item) > GUC_WQ_SIZE);
> +

I believe we also need to multiply by I915_NUM_ENGINES here since we 
share the WQ across all engines.

>  	if (!client) {
>  		client = guc_client_alloc(dev_priv,
>  					  INTEL_INFO(dev_priv)->ring_mask,
> @@ -1250,7 +1185,6 @@ int i915_guc_submission_enable(struct drm_i915_private *dev_priv)
>  	guc_interrupts_capture(dev_priv);
>
>  	for_each_engine(engine, dev_priv, id) {
> -		const int wqi_size = sizeof(struct guc_wq_item);
>  		struct drm_i915_gem_request *rq;
>
>  		/* The tasklet was initialised by execlists, and may be in
> @@ -1263,10 +1197,8 @@ int i915_guc_submission_enable(struct drm_i915_private *dev_priv)
>
>  		/* Replay the current set of previously submitted requests */
>  		spin_lock_irq(&engine->timeline->lock);
> -		list_for_each_entry(rq, &engine->timeline->requests, link) {
> -			guc_client_update_wq_rsvd(client, wqi_size);
> +		list_for_each_entry(rq, &engine->timeline->requests, link)
>  			i915_guc_submit(rq);

Aren't we potentially sending requests that were squashed in 
i915_guc_dequeue on different wq items here, thus potentially (although 
unlikely) overflowing the wq?

Thanks,
Daniele

> -		}
>  		spin_unlock_irq(&engine->timeline->lock);
>  	}
>


More information about the Intel-gfx mailing list