diff options
author | Arjan van de Ven <arjan@linux.intel.com> | 2010-08-20 17:12:46 -0400 |
---|---|---|
committer | Arjan van de Ven <arjan@linux.intel.com> | 2010-08-20 17:12:46 -0400 |
commit | b8cd3a0113280240425b808d0c7673b3f5fe606f (patch) | |
tree | e40a4b9e9c9f9eaa45e2e4506de39882480ed5bd /process/do_process.cpp | |
parent | 836f13f70da0ed16108dd2bef01eb7ff698a44df (diff) | |
download | powertop-b8cd3a0113280240425b808d0c7673b3f5fe606f.tar.gz |
add hrtimers
Diffstat (limited to 'process/do_process.cpp')
-rw-r--r-- | process/do_process.cpp | 34 |
1 files changed, 33 insertions, 1 deletions
diff --git a/process/do_process.cpp b/process/do_process.cpp index bd702da..8fe0edd 100644 --- a/process/do_process.cpp +++ b/process/do_process.cpp @@ -277,7 +277,8 @@ void perf_process_bundle::handle_trace_point(int type, void *trace, int cpu, uin timer->fire(time, (uint64_t)tmr->timer); - change_blame(cpu, timer, LEVEL_TIMER); + if (strcmp(timer->handler, "delayed_work_timer_fn")) + change_blame(cpu, timer, LEVEL_TIMER); } if (strcmp(event_name, "timer:timer_expire_exit") == 0) { class timer *timer; @@ -294,6 +295,35 @@ void perf_process_bundle::handle_trace_point(int type, void *trace, int cpu, uin t = timer->done(time, (uint64_t)tmr->timer); consumer_child_time(cpu, t); } + if (strcmp(event_name, "timer:hrtimer_expire_entry") == 0) { + struct hrtimer_expire *tmr; + class timer *timer; + tmr = (struct hrtimer_expire *)trace; + + timer = find_create_timer((uint64_t)tmr->function); + + push_consumer(cpu, timer); + timer->fire(time, (uint64_t)tmr->timer); + + + if (strcmp(timer->handler, "delayed_work_timer_fn")) + change_blame(cpu, timer, LEVEL_TIMER); + } + if (strcmp(event_name, "timer:hrtimer_expire_exit") == 0) { + class timer *timer; + struct timer_cancel *tmr; + uint64_t t; + tmr = (struct timer_cancel *)trace; + + timer = (class timer *) current_consumer(cpu); + if (timer && strcmp(timer->name(), "timer")) { + printf("not a timer\n"); + return; + } + pop_consumer(cpu); + t = timer->done(time, (uint64_t)tmr->timer); + consumer_child_time(cpu, t); + } if (strcmp(event_name, "power:power_start") == 0) { set_wakeup_pending(cpu); } @@ -314,6 +344,8 @@ void start_process_measurement(void) perf_events->add_event("irq:softirq_exit"); perf_events->add_event("timer:timer_expire_entry"); perf_events->add_event("timer:timer_expire_exit"); + perf_events->add_event("timer:hrtimer_expire_entry"); + perf_events->add_event("timer:hrtimer_expire_exit"); perf_events->add_event("power:power_start"); perf_events->add_event("power:power_end"); } |