]> git.ipfire.org Git - thirdparty/kernel/stable.git/commitdiff
i915/guc: Ensure busyness counter increases motonically
authorUmesh Nerlige Ramappa <umesh.nerlige.ramappa@intel.com>
Wed, 27 Nov 2024 17:40:05 +0000 (09:40 -0800)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Fri, 27 Dec 2024 12:52:57 +0000 (13:52 +0100)
[ Upstream commit 59a0b46788d58fdcee8d2f6b4e619d264a1799bf ]

Active busyness of an engine is calculated using gt timestamp and the
context switch in time. While capturing the gt timestamp, it's possible
that the context switches out. This race could result in an active
busyness value that is greater than the actual context runtime value by a
small amount. This leads to a negative delta and throws off busyness
calculations for the user.

If a subsequent count is smaller than the previous one, just return the
previous one, since we expect the busyness to catch up.

Fixes: 77cdd054dd2c ("drm/i915/pmu: Connect engine busyness stats from GuC to pmu")
Signed-off-by: Umesh Nerlige Ramappa <umesh.nerlige.ramappa@intel.com>
Reviewed-by: John Harrison <John.C.Harrison@Intel.com>
Link: https://patchwork.freedesktop.org/patch/msgid/20241127174006.190128-3-umesh.nerlige.ramappa@intel.com
(cherry picked from commit cf907f6d294217985e9dafd9985dce874e04ca37)
Signed-off-by: Tvrtko Ursulin <tursulin@ursulin.net>
Signed-off-by: Sasha Levin <sashal@kernel.org>
drivers/gpu/drm/i915/gt/intel_engine_types.h
drivers/gpu/drm/i915/gt/uc/intel_guc_submission.c

index 107f465a27b9e5c581a49c11a8d958256a85d47b..458320d28e2740e605ed14a6c07678749622784f 100644 (file)
@@ -339,6 +339,11 @@ struct intel_engine_guc_stats {
         * @start_gt_clk: GT clock time of last idle to active transition.
         */
        u64 start_gt_clk;
+
+       /**
+        * @total: The last value of total returned
+        */
+       u64 total;
 };
 
 struct intel_engine_cs {
index 4bfc1131b4f0039b439b200c1c088784dd6b1da5..2cd1f43f8a3c64a04adc473d678b56d52f09cf88 100644 (file)
@@ -1346,9 +1346,12 @@ static ktime_t guc_engine_busyness(struct intel_engine_cs *engine, ktime_t *now)
                total += intel_gt_clock_interval_to_ns(gt, clk);
        }
 
+       if (total > stats->total)
+               stats->total = total;
+
        spin_unlock_irqrestore(&guc->timestamp.lock, flags);
 
-       return ns_to_ktime(total);
+       return ns_to_ktime(stats->total);
 }
 
 static void __reset_guc_busyness_stats(struct intel_guc *guc)