[Intel-gfx] [PATCH v5 11/35] drm/i915: Added scheduler hook into i915_gem_request_notify()

Joonas Lahtinen joonas.lahtinen at linux.intel.com
Tue Mar 1 09:10:27 UTC 2016


On to, 2016-02-18 at 14:26 +0000, John.C.Harrison at Intel.com wrote:
> From: John Harrison <John.C.Harrison at Intel.com>
> 
> The scheduler needs to know when requests have completed so that it
> can keep its own internal state up to date and can submit new requests
> to the hardware from its queue.
> 
> v2: Updated due to changes in request handling. The operation is now
> reversed from before. Rather than the scheduler being in control of
> completion events, it is now the request code itself. The scheduler
> merely receives a notification event. It can then optionally request
> it's worker thread be woken up after all completion processing is
> complete.
> 
> v4: Downgraded a BUG_ON to a WARN_ON as the latter is preferred.
> 
> v5: Squashed the i915_scheduler.c portions down into the 'start of
> scheduler' patch. [Joonas Lahtinen]
> 
> For: VIZ-1587
> Signed-off-by: John Harrison <John.C.Harrison at Intel.com>
> Cc: Joonas Lahtinen <joonas.lahtinen at linux.intel.com>
> ---
>  drivers/gpu/drm/i915/i915_gem.c | 16 ++++++++++++++++
>  1 file changed, 16 insertions(+)
> 
> diff --git a/drivers/gpu/drm/i915/i915_gem.c b/drivers/gpu/drm/i915/i915_gem.c
> index 0003cfc..c3b7def 100644
> --- a/drivers/gpu/drm/i915/i915_gem.c
> +++ b/drivers/gpu/drm/i915/i915_gem.c
> @@ -2872,6 +2872,7 @@ void i915_gem_request_notify(struct intel_engine_cs *ring, bool fence_locked)
>  {
>  	struct drm_i915_gem_request *req, *req_next;
>  	unsigned long flags;
> +	bool wake_sched = false;
>  	u32 seqno;
>  
>  	if (list_empty(&ring->fence_signal_list)) {
> @@ -2908,6 +2909,14 @@ void i915_gem_request_notify(struct intel_engine_cs *ring, bool fence_locked)
>  		 */
>  		list_del_init(&req->signal_link);
>  
> +		/*
> +		 * NB: Must notify the scheduler before signalling
> +		 * the node. Otherwise the node can get retired first
> +		 * and call scheduler_clean() while the scheduler
> +		 * thinks it is still active.
> +		 */
> +		wake_sched |= i915_scheduler_notify_request(req);

		if (i915_scheduler_notify_request(req))
			wake_sched = true;

> +
>  		if (!req->cancelled) {
>  			fence_signal_locked(&req->fence);
>  			trace_i915_gem_request_complete(req);
> @@ -2924,6 +2933,13 @@ void i915_gem_request_notify(struct intel_engine_cs *ring, bool fence_locked)
>  
>  	if (!fence_locked)
>  		spin_unlock_irqrestore(&ring->fence_lock, flags);
> +
> +	/* Necessary? Or does the fence_signal() call do an implicit wakeup? */
> +	wake_up_all(&ring->irq_queue);

This should probably be figured out after the struct fence series is
merged.

Regards, Joonas
> +
> +	/* Final scheduler processing after all individual updates are done. */
> +	if (wake_sched)
> +		i915_scheduler_wakeup(ring->dev);
>  }
>  
>  static const char *i915_gem_request_get_driver_name(struct fence *req_fence)
-- 
Joonas Lahtinen
Open Source Technology Center
Intel Corporation


More information about the Intel-gfx mailing list