Re: [PATCH] drm/i915: Remove superfluous worker wakeups when RPS is already boosted

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



On Tue, Feb 06, 2018 at 02:31:37PM +0000, Chris Wilson wrote:
> We only need to wake up the RPS worker once when initially enabling the
> client boost, it remains in effect then until the last client no longer
> requires the boost.

Reviewed-by: Michał Winiarski <michal.winiarski@xxxxxxxxx>

-Michał

> 
> References: https://bugs.freedesktop.org/show_bug.cgi?id=102250
> References: 7b92c1bd0540 ("drm/i915: Avoid keeping waitboost active for signaling threads")
> Signed-off-by: Chris Wilson <chris@xxxxxxxxxxxxxxxxxx>
> Cc: Michał Winiarski <michal.winiarski@xxxxxxxxx>
> ---
>  drivers/gpu/drm/i915/i915_gem_request.c | 6 ++++--
>  drivers/gpu/drm/i915/intel_pm.c         | 9 ++++++---
>  2 files changed, 10 insertions(+), 5 deletions(-)
> 
> diff --git a/drivers/gpu/drm/i915/i915_gem_request.c b/drivers/gpu/drm/i915/i915_gem_request.c
> index 8efa9e7a9e46..794263421aa0 100644
> --- a/drivers/gpu/drm/i915/i915_gem_request.c
> +++ b/drivers/gpu/drm/i915/i915_gem_request.c
> @@ -443,12 +443,14 @@ static void i915_gem_request_retire(struct drm_i915_gem_request *request)
>  	engine->last_retired_context = request->ctx;
>  
>  	spin_lock_irq(&request->lock);
> -	if (request->waitboost)
> -		atomic_dec(&request->i915->gt_pm.rps.num_waiters);
>  	if (!test_bit(DMA_FENCE_FLAG_SIGNALED_BIT, &request->fence.flags))
>  		dma_fence_signal_locked(&request->fence);
>  	if (test_bit(DMA_FENCE_FLAG_ENABLE_SIGNAL_BIT, &request->fence.flags))
>  		intel_engine_cancel_signaling(request);
> +	if (request->waitboost) {
> +		GEM_BUG_ON(!atomic_read(&request->i915->gt_pm.rps.num_waiters));
> +		atomic_dec(&request->i915->gt_pm.rps.num_waiters);
> +	}
>  	spin_unlock_irq(&request->lock);
>  
>  	i915_priotree_fini(request->i915, &request->priotree);
> diff --git a/drivers/gpu/drm/i915/intel_pm.c b/drivers/gpu/drm/i915/intel_pm.c
> index eb68abf6a8e9..5b36166976e3 100644
> --- a/drivers/gpu/drm/i915/intel_pm.c
> +++ b/drivers/gpu/drm/i915/intel_pm.c
> @@ -6372,12 +6372,15 @@ void gen6_rps_boost(struct drm_i915_gem_request *rq,
>  	if (!rps->enabled)
>  		return;
>  
> +	if (test_bit(DMA_FENCE_FLAG_SIGNALED_BIT, &rq->fence.flags))
> +		return;
> +
> +	/* Serializes with i915_gem_request_retire() */
>  	boost = false;
>  	spin_lock_irqsave(&rq->lock, flags);
> -	if (!rq->waitboost && !i915_gem_request_completed(rq)) {
> -		atomic_inc(&rps->num_waiters);
> +	if (!rq->waitboost && !dma_fence_is_signaled_locked(&rq->fence)) {
> +		boost = !atomic_fetch_inc(&rps->num_waiters);
>  		rq->waitboost = true;
> -		boost = true;
>  	}
>  	spin_unlock_irqrestore(&rq->lock, flags);
>  	if (!boost)
> -- 
> 2.16.1
> 
_______________________________________________
Intel-gfx mailing list
Intel-gfx@xxxxxxxxxxxxxxxxxxxxx
https://lists.freedesktop.org/mailman/listinfo/intel-gfx




[Index of Archives]     [Linux USB Devel]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]
  Powered by Linux