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);
 
         * add it to the total.
         */
        *now = ktime_get();
-       if (atomic_read(&engine->stats.active))
+       if (READ_ONCE(engine->stats.active))
                total = ktime_add(total, ktime_sub(*now, engine->stats.start));
 
        return total;
        ktime_t total;
 
        do {
-               seq = read_seqbegin(&engine->stats.lock);
+               seq = read_seqcount_begin(&engine->stats.lock);
                total = __intel_engine_get_busy_time(engine, now);
-       } while (read_seqretry(&engine->stats.lock, seq));
+       } while (read_seqcount_retry(&engine->stats.lock, seq));
 
        return total;
 }
 
 {
        unsigned long flags;
 
-       if (atomic_add_unless(&engine->stats.active, 1, 0))
+       if (engine->stats.active) {
+               engine->stats.active++;
                return;
-
-       write_seqlock_irqsave(&engine->stats.lock, flags);
-       if (!atomic_add_unless(&engine->stats.active, 1, 0)) {
-               engine->stats.start = ktime_get();
-               atomic_inc(&engine->stats.active);
        }
-       write_sequnlock_irqrestore(&engine->stats.lock, flags);
+
+       /* The writer is serialised; but the pmu reader may be from hardirq */
+       local_irq_save(flags);
+       write_seqcount_begin(&engine->stats.lock);
+
+       engine->stats.start = ktime_get();
+       engine->stats.active++;
+
+       write_seqcount_end(&engine->stats.lock);
+       local_irq_restore(flags);
+
+       GEM_BUG_ON(!engine->stats.active);
 }
 
 static inline void intel_engine_context_out(struct intel_engine_cs *engine)
 {
        unsigned long flags;
 
-       GEM_BUG_ON(!atomic_read(&engine->stats.active));
-
-       if (atomic_add_unless(&engine->stats.active, -1, 1))
+       GEM_BUG_ON(!engine->stats.active);
+       if (engine->stats.active > 1) {
+               engine->stats.active--;
                return;
-
-       write_seqlock_irqsave(&engine->stats.lock, flags);
-       if (atomic_dec_and_test(&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);
+
+       local_irq_save(flags);
+       write_seqcount_begin(&engine->stats.lock);
+
+       engine->stats.active--;
+       engine->stats.total =
+               ktime_add(engine->stats.total,
+                         ktime_sub(ktime_get(), engine->stats.start));
+
+       write_seqcount_end(&engine->stats.lock);
+       local_irq_restore(flags);
 }
 
 #endif /* __INTEL_ENGINE_STATS_H__ */