[Intel-gfx] [RFC 04/11] drm/i915/preempt: Implement null preemption method

Chris Wilson chris at chris-wilson.co.uk
Thu Feb 23 21:37:16 UTC 2017


On Thu, Feb 23, 2017 at 08:08:26PM +0100, MichaƂ Winiarski wrote:
> +static void __execlists_try_preempt(struct intel_engine_cs *engine,
> +				  int prio)
> +{
> +	struct drm_i915_gem_request *rq;
> +	int highest_prio = INT_MIN;
> +	int ret;
> +
> +	spin_lock_irq(&engine->timeline->lock);
> +
> +	/* Engine is idle */
> +	if (execlists_elsp_idle(engine))
> +		goto out_unlock;
> +
> +	if (engine->preempt_requested)
> +		goto out_unlock;
> +
> +	list_for_each_entry_reverse(rq, &engine->timeline->requests, link) {
> +		if (!i915_gem_request_completed(rq)) {
> +			highest_prio = (rq->priotree.priority > highest_prio) ?
> +				 rq->priotree.priority : highest_prio;
> +		} else
> +			break;
> +	}
> +
> +	/* Bail out if our priority is lower than any of the inflight requests
> +	 * (also if there are none requests) */
> +	if (highest_prio == INT_MIN || prio <= highest_prio)
> +		goto out_unlock;
> +
> +	engine->preempt_requested = true;

Here you are meant to unwind the already submitted requests and put them
back onto their rq->timelines.
-Chris

-- 
Chris Wilson, Intel Open Source Technology Centre


More information about the Intel-gfx mailing list