[Intel-gfx] [PATCH 01/31] drm/i915: Reduce breadcrumb lock coverage for intel_engine_enable_signaling()

Joonas Lahtinen joonas.lahtinen at linux.intel.com
Tue Jul 26 04:37:42 UTC 2016


On ma, 2016-07-25 at 08:44 +0100, Chris Wilson wrote:
> Since intel_engine_enable_signaling() is now only called via
> fence_enable_sw_signaling(), we can rely on it to provide serialisation
> and run-once for us and so make ourselves slightly simpler.
> 

Originally left this patch for Tvrtko, not remembering he's traveling.

assert_spin_locked() should make this enough robust that it'll still do
what it did perviously.

Reviewed-by: Joonas Lahtinen <joonas.lahtinen at linux.intel.com>

Regards, Joonas

> Signed-off-by: Chris Wilson <chris at chris-wilson.co.uk>
> ---
>  drivers/gpu/drm/i915/intel_breadcrumbs.c | 13 ++++---------
>  1 file changed, 4 insertions(+), 9 deletions(-)
> 
> diff --git a/drivers/gpu/drm/i915/intel_breadcrumbs.c b/drivers/gpu/drm/i915/intel_breadcrumbs.c
> index d893ccdd62ac..90867446f1a5 100644
> --- a/drivers/gpu/drm/i915/intel_breadcrumbs.c
> +++ b/drivers/gpu/drm/i915/intel_breadcrumbs.c
> @@ -480,19 +480,15 @@ void intel_engine_enable_signaling(struct drm_i915_gem_request *request)
>  	struct rb_node *parent, **p;
>  	bool first, wakeup;
>  
> -	if (unlikely(READ_ONCE(request->signaling.wait.tsk)))
> -		return;
> -
> -	spin_lock(&b->lock);
> -	if (unlikely(request->signaling.wait.tsk)) {
> -		wakeup = false;
> -		goto unlock;
> -	}
> +	/* locked by fence_enable_sw_signaling() */
> +	assert_spin_locked(&request->lock);
>  
>  	request->signaling.wait.tsk = b->signaler;
>  	request->signaling.wait.seqno = request->fence.seqno;
>  	i915_gem_request_get(request);
>  
> +	spin_lock(&b->lock);
> +
>  	/* First add ourselves into the list of waiters, but register our
>  	 * bottom-half as the signaller thread. As per usual, only the oldest
>  	 * waiter (not just signaller) is tasked as the bottom-half waking
> @@ -525,7 +521,6 @@ void intel_engine_enable_signaling(struct drm_i915_gem_request *request)
>  	if (first)
>  		smp_store_mb(b->first_signal, request);
>  
> -unlock:
>  	spin_unlock(&b->lock);
>  
>  	if (wakeup)
-- 
Joonas Lahtinen
Open Source Technology Center
Intel Corporation


More information about the Intel-gfx mailing list