drm/i915/pmu: Reconstruct active state on starting busy-stats

"Linux Kernel Mailing List" <[email protected]>
Newsgroups gmane.linux.kernel.commits.head
Message-ID <[email protected]>
Web:        https://git.kernel.org/torvalds/c/cc4f8fc72eb949889caa1d574d3db65fa9d71a12
Commit:     cc4f8fc72eb949889caa1d574d3db65fa9d71a12
Parent:     25da77f83068bfc95d08ddfb8e6c53983901e278
Refname:    refs/heads/master
Author:     Chris Wilson <[email protected]>
AuthorDate: Thu Jan 11 07:30:31 2018 +0000
Committer:  Rodrigo Vivi <[email protected]>
CommitDate: Thu Feb 1 07:31:42 2018 -0800

    drm/i915/pmu: Reconstruct active state on starting busy-stats
    
    We have a hole in our busy-stat accounting if the pmu is enabled during
    a long running batch, the pmu will not start accumulating busy-time
    until the next context switch. This then fails tests that are only
    sampling a single batch.
    
    v2: Count each active port just once (context in/out events are only on
    the first and last assignment to a port).
    v3: Avoid hardcoding knowledge of 2 submission ports
    
    Fixes: 30e17b7847f5 ("drm/i915: Engine busy time tracking")
    Testcase: igt/perf_pmu/busy-start
    Testcase: igt/perf_pmu/busy-double-start
    Signed-off-by: Chris Wilson <[email protected]>
    Cc: Tvrtko Ursulin <[email protected]>
    Reviewed-by: Tvrtko Ursulin <[email protected]>
    Link: https://patchwork.freedesktop.org/patch/msgid/[email protected]
    (cherry picked from commit 4900727d35bb20028f9bd83146ec4bf78afffe30)
    Signed-off-by: Rodrigo Vivi <[email protected]>
---
 drivers/gpu/drm/i915/intel_engine_cs.c | 16 +++++++++++++++-
 1 file changed, 15 insertions(+), 1 deletion(-)

diff --git a/drivers/gpu/drm/i915/intel_engine_cs.c b/drivers/gpu/drm/i915/intel_engine_cs.c
index 6bb51a502b8b..d790bdc227ff 100644
--- a/drivers/gpu/drm/i915/intel_engine_cs.c
+++ b/drivers/gpu/drm/i915/intel_engine_cs.c
@@ -1951,8 +1951,22 @@ int intel_enable_engine_stats(struct intel_engine_cs *engine)
 	spin_lock_irqsave(&engine->stats.lock, flags);
 	if (engine->stats.enabled == ~0)
 		goto busy;
-	if (engine->stats.enabled++ == 0)
+	if (engine->stats.enabled++ == 0) {
+		struct intel_engine_execlists *execlists = &engine->execlists;
+		const struct execlist_port *port = execlists->port;
+		unsigned int num_ports = execlists_num_ports(execlists);
+
 		engine->stats.enabled_at = ktime_get();
+
+		/* XXX submission method oblivious? */
+		while (num_ports-- && port_isset(port)) {
+			engine->stats.active++;
+			port++;
+		}
+
+		if (engine->stats.active)
+			engine->stats.start = engine->stats.enabled_at;
+	}
 	spin_unlock_irqrestore(&engine->stats.lock, flags);
 
 	return 0;
--
To unsubscribe from this list: send the line "unsubscribe git-commits-head" in
the body of a message to [email protected]
More majordomo info at  http://vger.kernel.org/majordomo-info.html
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.