[Intel-gfx] [PATCH 2/5] drm/i915/selftests: Flush the active callbacks

Tvrtko Ursulin tvrtko.ursulin at linux.intel.com
Fri Nov 22 13:01:56 UTC 2019


On 22/11/2019 11:21, Chris Wilson wrote:
> Before checking the current i915_active state for the asynchronous work
> we submitted, flush any ongoing callback. This ensures that our sampling
> is robust and does not sporadically fail due to bad timing as the work
> is running on another cpu.
> 
> Signed-off-by: Chris Wilson <chris at chris-wilson.co.uk>
> ---
>   drivers/gpu/drm/i915/gt/selftest_context.c | 19 +++++++++++++------
>   1 file changed, 13 insertions(+), 6 deletions(-)
> 
> diff --git a/drivers/gpu/drm/i915/gt/selftest_context.c b/drivers/gpu/drm/i915/gt/selftest_context.c
> index 3586af636304..939798338242 100644
> --- a/drivers/gpu/drm/i915/gt/selftest_context.c
> +++ b/drivers/gpu/drm/i915/gt/selftest_context.c
> @@ -48,20 +48,25 @@ static int context_sync(struct intel_context *ce)
>   
>   	mutex_lock(&tl->mutex);
>   	do {
> -		struct dma_fence *fence;
> +		struct i915_request *rq;
>   		long timeout;
>   
> -		fence = i915_active_fence_get(&tl->last_request);
> -		if (!fence)
> +		if (list_empty(&tl->requests))
>   			break;
>   
> -		timeout = dma_fence_wait_timeout(fence, false, HZ / 10);
> +		rq = list_last_entry(&tl->requests, typeof(*rq), link);
> +		i915_request_get(rq);
> +
> +		timeout = i915_request_wait(rq, 0, HZ / 10);
>   		if (timeout < 0)
>   			err = timeout;
>   		else
> -			i915_request_retire_upto(to_request(fence));
> +			i915_request_retire_upto(rq);
>   
> -		dma_fence_put(fence);
> +		spin_lock_irq(&rq->lock);
> +		spin_unlock_irq(&rq->lock);

Ugh.. this at least needs a comment.

What is the actual race?

Regards,

Tvrtko

> +
> +		i915_request_put(rq);
>   	} while (!err);
>   	mutex_unlock(&tl->mutex);
>   
> @@ -282,6 +287,8 @@ static int __live_active_context(struct intel_engine_cs *engine,
>   		err = -EINVAL;
>   	}
>   
> +	intel_engine_pm_flush(engine);
> +
>   	if (intel_engine_pm_is_awake(engine)) {
>   		struct drm_printer p = drm_debug_printer(__func__);
>   
> 


More information about the Intel-gfx mailing list