diff options
Diffstat (limited to 'drivers/gpu/drm/i915/i915_active.c')
| -rw-r--r-- | drivers/gpu/drm/i915/i915_active.c | 28 | 
1 files changed, 15 insertions, 13 deletions
| diff --git a/drivers/gpu/drm/i915/i915_active.c b/drivers/gpu/drm/i915/i915_active.c index 7412abf166a8..8ef93889061a 100644 --- a/drivers/gpu/drm/i915/i915_active.c +++ b/drivers/gpu/drm/i915/i915_active.c @@ -92,8 +92,7 @@ static void debug_active_init(struct i915_active *ref)  static void debug_active_activate(struct i915_active *ref)  {  	lockdep_assert_held(&ref->tree_lock); -	if (!atomic_read(&ref->count)) /* before the first inc */ -		debug_object_activate(ref, &active_debug_desc); +	debug_object_activate(ref, &active_debug_desc);  }  static void debug_active_deactivate(struct i915_active *ref) @@ -422,12 +421,12 @@ replace_barrier(struct i915_active *ref, struct i915_active_fence *active)  	 * we can use it to substitute for the pending idle-barrer  	 * request that we want to emit on the kernel_context.  	 */ -	__active_del_barrier(ref, node_from_active(active)); -	return true; +	return __active_del_barrier(ref, node_from_active(active));  }  int i915_active_add_request(struct i915_active *ref, struct i915_request *rq)  { +	u64 idx = i915_request_timeline(rq)->fence_context;  	struct dma_fence *fence = &rq->fence;  	struct i915_active_fence *active;  	int err; @@ -437,16 +436,19 @@ int i915_active_add_request(struct i915_active *ref, struct i915_request *rq)  	if (err)  		return err; -	active = active_instance(ref, i915_request_timeline(rq)->fence_context); -	if (!active) { -		err = -ENOMEM; -		goto out; -	} +	do { +		active = active_instance(ref, idx); +		if (!active) { +			err = -ENOMEM; +			goto out; +		} + +		if (replace_barrier(ref, active)) { +			RCU_INIT_POINTER(active->fence, NULL); +			atomic_dec(&ref->count); +		} +	} while (unlikely(is_barrier(active))); -	if (replace_barrier(ref, active)) { -		RCU_INIT_POINTER(active->fence, NULL); -		atomic_dec(&ref->count); -	}  	if (!__i915_active_fence_set(active, fence))  		__i915_active_acquire(ref); |