diff options
author | Thomas Renninger <trenn@suse.de> | 2010-04-20 07:17:36 -0400 |
---|---|---|
committer | Dave Jones <davej@redhat.com> | 2010-08-03 13:47:05 -0400 |
commit | 6f4f2723d08534fd4e407e1ef8500b0f4d12c30c (patch) | |
tree | 3422ba34e7c6bde7e8d4ca1f1f1ed772efc5cc4c /tools | |
parent | 6b72e3934b42930fd40fc42fe762d21be413301c (diff) |
[CPUFREQ] x86 cpufreq: Make trace_power_frequency cpufreq driver independent
and fix the broken case if a core's frequency depends on others.
trace_power_frequency was only implemented in a rather ungeneric way
in acpi-cpufreq driver's target() function only.
-> Move the call to trace_power_frequency to
cpufreq.c:cpufreq_notify_transition() where CPUFREQ_POSTCHANGE
notifier is triggered.
This will support power frequency tracing by all cpufreq drivers
trace_power_frequency did not trace frequency changes correctly when
the userspace governor was used or when CPU cores' frequency depend
on each other.
-> Moving this into the CPUFREQ_POSTCHANGE notifier and pass the cpu
which gets switched automatically fixes this.
Robert Schoene provided some important fixes on top of my initial
quick shot version which are integrated in this patch:
- Forgot some changes in power_end trace (TP_printk/variable names)
- Variable dummy in power_end must now be cpu_id
- Use static 64 bit variable instead of unsigned int for cpu_id
Signed-off-by: Thomas Renninger <trenn@suse.de>
CC: davej@redhat.com
CC: arjan@infradead.org
CC: linux-kernel@vger.kernel.org
CC: robert.schoene@tu-dresden.de
Tested-by: robert.schoene@tu-dresden.de
Signed-off-by: Dave Jones <davej@redhat.com>
Diffstat (limited to 'tools')
-rw-r--r-- | tools/perf/builtin-timechart.c | 11 |
1 files changed, 6 insertions, 5 deletions
diff --git a/tools/perf/builtin-timechart.c b/tools/perf/builtin-timechart.c index 5a52ed9fc10b..5161619d4714 100644 --- a/tools/perf/builtin-timechart.c +++ b/tools/perf/builtin-timechart.c | |||
@@ -300,8 +300,9 @@ struct trace_entry { | |||
300 | 300 | ||
301 | struct power_entry { | 301 | struct power_entry { |
302 | struct trace_entry te; | 302 | struct trace_entry te; |
303 | s64 type; | 303 | u64 type; |
304 | s64 value; | 304 | u64 value; |
305 | u64 cpu_id; | ||
305 | }; | 306 | }; |
306 | 307 | ||
307 | #define TASK_COMM_LEN 16 | 308 | #define TASK_COMM_LEN 16 |
@@ -498,13 +499,13 @@ static int process_sample_event(event_t *event, struct perf_session *session) | |||
498 | return 0; | 499 | return 0; |
499 | 500 | ||
500 | if (strcmp(event_str, "power:power_start") == 0) | 501 | if (strcmp(event_str, "power:power_start") == 0) |
501 | c_state_start(data.cpu, data.time, pe->value); | 502 | c_state_start(pe->cpu_id, data.time, pe->value); |
502 | 503 | ||
503 | if (strcmp(event_str, "power:power_end") == 0) | 504 | if (strcmp(event_str, "power:power_end") == 0) |
504 | c_state_end(data.cpu, data.time); | 505 | c_state_end(pe->cpu_id, data.time); |
505 | 506 | ||
506 | if (strcmp(event_str, "power:power_frequency") == 0) | 507 | if (strcmp(event_str, "power:power_frequency") == 0) |
507 | p_state_change(data.cpu, data.time, pe->value); | 508 | p_state_change(pe->cpu_id, data.time, pe->value); |
508 | 509 | ||
509 | if (strcmp(event_str, "sched:sched_wakeup") == 0) | 510 | if (strcmp(event_str, "sched:sched_wakeup") == 0) |
510 | sched_wakeup(data.cpu, data.time, data.pid, te); | 511 | sched_wakeup(data.cpu, data.time, data.pid, te); |