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