Linux kernel commit db53a30261 (drm/i915: Refine tracepoints) changed
the tracepoints available in the i915 driver.

The i915_gem_request_submit tracepoint triggered by
render_ring_dispatch_execbuffer() was one of the removed ones,
preventing us from getting a GPU ops/s readout on recent kernel
versions.

Add support for using the newly added i915_gem_ring_dispatch tracepoint,
which is triggered by i915_gem_do_execbuffer() when it calls
dispatch_execbuffer for a ring. This is therefore also triggered for blt
and bsd (bitstream decoder) engines in addition to the render engine.

Reported-by: Juho Teperi <juho.tep...@tut.fi>
Signed-off-by: Anssi Hannula <anssi.hann...@iki.fi>
---

Note that I'm no GPU expert, I just looked at the i915 source code.

As noted above, the new tracepoint also triggers for the other engines.
The specific ring is provided with the tracepoint, but I didn't add
any filtering based on it as I'd guess we'd want to count ops from all
engines. If that is not the case, filtering can be added.

 devices/i915-gpu.cpp   |   12 ++++++++----
 process/do_process.cpp |    6 +++++-
 2 files changed, 13 insertions(+), 5 deletions(-)

diff --git a/devices/i915-gpu.cpp b/devices/i915-gpu.cpp
index a9dc899..59f53fd 100644
--- a/devices/i915-gpu.cpp
+++ b/devices/i915-gpu.cpp
@@ -66,10 +66,14 @@ void create_i915_gpu(void)
        char filename[4096];
        class i915gpu *gpu;
 
-       strcpy(filename, 
"/sys/kernel/debug/tracing/events/i915/i915_gem_request_submit/format");
+       strcpy(filename, 
"/sys/kernel/debug/tracing/events/i915/i915_gem_ring_dispatch/format");
 
-       if (access(filename, R_OK) !=0)
-               return;
+       if (access(filename, R_OK) !=0) {
+               /* try an older tracepoint */
+               strcpy(filename, 
"/sys/kernel/debug/tracing/events/i915/i915_gem_request_submit/format");
+               if (access(filename, R_OK) != 0)
+                       return;
+       }
 
        register_parameter("gpu-operations");
 
@@ -91,4 +95,4 @@ double i915gpu::power_usage(struct result_bundle *result, 
struct parameter_bundl
 
        power += util * factor / 100.0;
        return power;
-}
\ No newline at end of file
+}
diff --git a/process/do_process.cpp b/process/do_process.cpp
index b105b28..b76eacd 100644
--- a/process/do_process.cpp
+++ b/process/do_process.cpp
@@ -447,7 +447,10 @@ void perf_process_bundle::handle_trace_point(int type, 
void *trace, int cpu, uin
        if (strcmp(event_name, "power:power_end") == 0) {
                consume_blame(cpu);
        }
-       if (strcmp(event_name, "i915:i915_gem_request_submit") == 0) {
+       if (strcmp(event_name, "i915:i915_gem_ring_dispatch") == 0
+        || strcmp(event_name, "i915:i915_gem_request_submit") == 0) {
+               /* any kernel contains only one of the these tracepoints,
+                * the latter one got replaced by the former one */
                class power_consumer *consumer;
                consumer = current_consumer(cpu);
                /* currently we don't count graphic requests submitted from irq 
contect */
@@ -510,6 +513,7 @@ void start_process_measurement(void)
                perf_events->add_event("power:power_end");
                perf_events->add_event("workqueue:workqueue_execute_start");
                perf_events->add_event("workqueue:workqueue_execute_end");
+               perf_events->add_event("i915:i915_gem_ring_dispatch");
                perf_events->add_event("i915:i915_gem_request_submit");
                perf_events->add_event("writeback:writeback_inode_dirty");
        }
-- 
1.7.7.2

_______________________________________________
Power mailing list
Power@bughost.org
https://bughost.org/mailman/listinfo/power

Reply via email to