Since we use a flag within i915_request.flags to indicate when we have
boosted the request (so that we only apply the boost) once, this can be
used as the serialisation with i915_request_retire() to avoid having to
explicitly take the i915_request.lock which is more heavily contended.

Signed-off-by: Chris Wilson <ch...@chris-wilson.co.uk>
---
 drivers/gpu/drm/i915/gt/intel_rps.c | 15 ++++++---------
 drivers/gpu/drm/i915/i915_request.c |  4 +---
 2 files changed, 7 insertions(+), 12 deletions(-)

diff --git a/drivers/gpu/drm/i915/gt/intel_rps.c 
b/drivers/gpu/drm/i915/gt/intel_rps.c
index e6a00eea0631..2a43e216e0d4 100644
--- a/drivers/gpu/drm/i915/gt/intel_rps.c
+++ b/drivers/gpu/drm/i915/gt/intel_rps.c
@@ -889,17 +889,15 @@ void intel_rps_park(struct intel_rps *rps)
 
 void intel_rps_boost(struct i915_request *rq)
 {
-       struct intel_rps *rps = &READ_ONCE(rq->engine)->gt->rps;
-       unsigned long flags;
-
-       if (i915_request_signaled(rq) || !intel_rps_is_active(rps))
+       if (i915_request_signaled(rq) || i915_request_has_waitboost(rq))
                return;
 
        /* Serializes with i915_request_retire() */
-       spin_lock_irqsave(&rq->lock, flags);
-       if (!i915_request_has_waitboost(rq) &&
-           !dma_fence_is_signaled_locked(&rq->fence)) {
-               set_bit(I915_FENCE_FLAG_BOOST, &rq->fence.flags);
+       if (!test_and_set_bit(I915_FENCE_FLAG_BOOST, &rq->fence.flags)) {
+               struct intel_rps *rps = &READ_ONCE(rq->engine)->gt->rps;
+
+               if (!intel_rps_is_active(rps))
+                       return;
 
                GT_TRACE(rps_to_gt(rps), "boost fence:%llx:%llx\n",
                         rq->fence.context, rq->fence.seqno);
@@ -910,7 +908,6 @@ void intel_rps_boost(struct i915_request *rq)
 
                atomic_inc(&rps->boosts);
        }
-       spin_unlock_irqrestore(&rq->lock, flags);
 }
 
 int intel_rps_set(struct intel_rps *rps, u8 val)
diff --git a/drivers/gpu/drm/i915/i915_request.c 
b/drivers/gpu/drm/i915/i915_request.c
index 247e021203c2..43614d8fa18d 100644
--- a/drivers/gpu/drm/i915/i915_request.c
+++ b/drivers/gpu/drm/i915/i915_request.c
@@ -306,10 +306,8 @@ bool i915_request_retire(struct i915_request *rq)
                spin_unlock_irq(&rq->lock);
        }
 
-       if (i915_request_has_waitboost(rq)) {
-               GEM_BUG_ON(!atomic_read(&rq->engine->gt->rps.num_waiters));
+       if (test_and_set_bit(I915_FENCE_FLAG_BOOST, &rq->fence.flags))
                atomic_dec(&rq->engine->gt->rps.num_waiters);
-       }
 
        /*
         * We only loosely track inflight requests across preemption,
-- 
2.20.1

_______________________________________________
Intel-gfx mailing list
Intel-gfx@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/intel-gfx

Reply via email to