As context-in/out is now always serialised, we do not have to worry
about concurrent enabling/disable of the busy-stats and can reduce the
atomic_t active to a plain unsigned int, and the seqlock to a seqcount.

Signed-off-by: Chris Wilson <[email protected]>
---
 drivers/gpu/drm/i915/gt/intel_engine_cs.c    |  8 +++---
 drivers/gpu/drm/i915/gt/intel_engine_stats.h | 28 +++++++-------------
 drivers/gpu/drm/i915/gt/intel_engine_types.h |  4 +--
 3 files changed, 15 insertions(+), 25 deletions(-)

diff --git a/drivers/gpu/drm/i915/gt/intel_engine_cs.c 
b/drivers/gpu/drm/i915/gt/intel_engine_cs.c
index 39471674a40f..c378f1c4afff 100644
--- a/drivers/gpu/drm/i915/gt/intel_engine_cs.c
+++ b/drivers/gpu/drm/i915/gt/intel_engine_cs.c
@@ -338,7 +338,7 @@ static int intel_engine_setup(struct intel_gt *gt, enum 
intel_engine_id id)
        engine->schedule = NULL;
 
        ewma__engine_latency_init(&engine->latency);
-       seqlock_init(&engine->stats.lock);
+       seqcount_init(&engine->stats.lock);
 
        ATOMIC_INIT_NOTIFIER_HEAD(&engine->context_status_notifier);
 
@@ -1606,7 +1606,7 @@ static ktime_t __intel_engine_get_busy_time(struct 
intel_engine_cs *engine)
         * If the engine is executing something at the moment
         * add it to the total.
         */
-       if (atomic_read(&engine->stats.active))
+       if (engine->stats.active)
                total = ktime_add(total,
                                  ktime_sub(ktime_get(), engine->stats.start));
 
@@ -1625,9 +1625,9 @@ ktime_t intel_engine_get_busy_time(struct intel_engine_cs 
*engine)
        ktime_t total;
 
        do {
-               seq = read_seqbegin(&engine->stats.lock);
+               seq = read_seqcount_begin(&engine->stats.lock);
                total = __intel_engine_get_busy_time(engine);
-       } while (read_seqretry(&engine->stats.lock, seq));
+       } while (read_seqcount_retry(&engine->stats.lock, seq));
 
        return total;
 }
diff --git a/drivers/gpu/drm/i915/gt/intel_engine_stats.h 
b/drivers/gpu/drm/i915/gt/intel_engine_stats.h
index 58491eae3482..09e4aca8cff6 100644
--- a/drivers/gpu/drm/i915/gt/intel_engine_stats.h
+++ b/drivers/gpu/drm/i915/gt/intel_engine_stats.h
@@ -15,35 +15,25 @@
 
 static inline void intel_engine_context_in(struct intel_engine_cs *engine)
 {
-       unsigned long flags;
+       raw_write_seqcount_begin(&engine->stats.lock);
 
-       if (atomic_add_unless(&engine->stats.active, 1, 0))
-               return;
-
-       write_seqlock_irqsave(&engine->stats.lock, flags);
-       if (!atomic_add_unless(&engine->stats.active, 1, 0)) {
+       if (!engine->stats.active++)
                engine->stats.start = ktime_get();
-               atomic_inc(&engine->stats.active);
-       }
-       write_sequnlock_irqrestore(&engine->stats.lock, flags);
+
+       raw_write_seqcount_end(&engine->stats.lock);
 }
 
 static inline void intel_engine_context_out(struct intel_engine_cs *engine)
 {
-       unsigned long flags;
-
-       GEM_BUG_ON(!atomic_read(&engine->stats.active));
+       raw_write_seqcount_begin(&engine->stats.lock);
 
-       if (atomic_add_unless(&engine->stats.active, -1, 1))
-               return;
-
-       write_seqlock_irqsave(&engine->stats.lock, flags);
-       if (atomic_dec_and_test(&engine->stats.active)) {
+       GEM_BUG_ON(!engine->stats.active);
+       if (!--engine->stats.active)
                engine->stats.total =
                        ktime_add(engine->stats.total,
                                  ktime_sub(ktime_get(), engine->stats.start));
-       }
-       write_sequnlock_irqrestore(&engine->stats.lock, flags);
+
+       raw_write_seqcount_end(&engine->stats.lock);
 }
 
 #endif /* __INTEL_ENGINE_STATS_H__ */
diff --git a/drivers/gpu/drm/i915/gt/intel_engine_types.h 
b/drivers/gpu/drm/i915/gt/intel_engine_types.h
index ca124f229f65..50951a129db5 100644
--- a/drivers/gpu/drm/i915/gt/intel_engine_types.h
+++ b/drivers/gpu/drm/i915/gt/intel_engine_types.h
@@ -557,12 +557,12 @@ struct intel_engine_cs {
                /**
                 * @active: Number of contexts currently scheduled in.
                 */
-               atomic_t active;
+               unsigned int active;
 
                /**
                 * @lock: Lock protecting the below fields.
                 */
-               seqlock_t lock;
+               seqcount_t lock;
 
                /**
                 * @total: Total time this engine was busy.
-- 
2.20.1

_______________________________________________
Intel-gfx mailing list
[email protected]
https://lists.freedesktop.org/mailman/listinfo/intel-gfx

Reply via email to