From c38294eb6ea346c9354d25f97e60ddcca8821903 Mon Sep 17 00:00:00 2001 From: Anssi Hannula Date: Sat, 26 Nov 2011 20:34:46 +0200 Subject: [PATCH 4/5] i915: adapt for changes in tracing of the i915 driver 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 Signed-off-by: Anssi Hannula --- 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