diff options
| author | Tapas Kumar Kundu <tkundu@codeaurora.org> | 2015-04-19 20:01:27 -0700 |
|---|---|---|
| committer | David Keitel <dkeitel@codeaurora.org> | 2016-03-23 21:22:28 -0700 |
| commit | e85e0f6452f41392ecff7063798319c5019d1750 (patch) | |
| tree | f85ec34cfc4810963dbbb7fe399bd35ed607f2be /include/trace/events | |
| parent | 010aa5bd7cdeee25c1f2290c7ebb62fe2ab8a16c (diff) | |
soc: qcom: msm_perf: Add timers to exit SINGLE mode
Certain governors may stop sending out notifications once CPUs enter
idle at min frequency.If governor's notifications stop then single mode
will not exit for long time. It can happen only if the exit conditions are
set in such a way that the time taken to exit single mode exceeds the time
for the governor to ramp down, idle out and hence stop sending
notifications leaving the system in single mode indefinitely.
This change adds separate enter/exit cycle sysfs nodes along with a per
cluster non-deferrable timer for single mode exit. The timer is armed only
when the load starts falling below the exit load threshold and is
cancelled when either the load starts going up or SINGLE mode is exited
due to exceeding exit cycle count. On expiry the timer resets SINGLE mode
and the enter/exit cycle counts.
Change-Id: I13552b2f4085c435b917833a2993f8c64ff4ed2f
Signed-off-by: Tapas Kumar Kundu <tkundu@codeaurora.org>
Diffstat (limited to 'include/trace/events')
| -rw-r--r-- | include/trace/events/power.h | 116 |
1 files changed, 102 insertions, 14 deletions
diff --git a/include/trace/events/power.h b/include/trace/events/power.h index 45382f5479bf..37d28157c0af 100644 --- a/include/trace/events/power.h +++ b/include/trace/events/power.h @@ -830,17 +830,19 @@ DEFINE_EVENT(kpm_module2, track_iowait, DECLARE_EVENT_CLASS(cpu_modes, TP_PROTO(unsigned int cpu, unsigned int max_load, - unsigned int single_cycles, unsigned int total_load, - unsigned int multi_cycles, unsigned int mode, - unsigned int cpu_cnt), + unsigned int single_enter_cycle_cnt, + unsigned int single_exit_cycle_cnt, + unsigned int total_load, unsigned int multi_cycles, + unsigned int mode, unsigned int cpu_cnt), - TP_ARGS(cpu, max_load, single_cycles, total_load, multi_cycles, - mode, cpu_cnt), + TP_ARGS(cpu, max_load, single_enter_cycle_cnt, single_exit_cycle_cnt, + total_load, multi_cycles, mode, cpu_cnt), TP_STRUCT__entry( __field(u32, cpu) __field(u32, max_load) - __field(u32, single_cycles) + __field(u32, single_enter_cycle_cnt) + __field(u32, single_exit_cycle_cnt) __field(u32, total_load) __field(u32, multi_cycles) __field(u32, mode) @@ -850,16 +852,18 @@ DECLARE_EVENT_CLASS(cpu_modes, TP_fast_assign( __entry->cpu = cpu; __entry->max_load = max_load; - __entry->single_cycles = single_cycles; + __entry->single_enter_cycle_cnt = single_enter_cycle_cnt; + __entry->single_exit_cycle_cnt = single_exit_cycle_cnt; __entry->total_load = total_load; __entry->multi_cycles = multi_cycles; __entry->mode = mode; __entry->cpu_cnt = cpu_cnt; ), - TP_printk("CPU:%u ml=%4u sc=%4u tl=%4u mc=%4u mode=%4u cpu_cnt=%u", + TP_printk("%u:%4u:%4u:%4u:%4u:%4u:%4u:%u", (unsigned int)__entry->cpu, (unsigned int)__entry->max_load, - (unsigned int)__entry->single_cycles, + (unsigned int)__entry->single_enter_cycle_cnt, + (unsigned int)__entry->single_exit_cycle_cnt, (unsigned int)__entry->total_load, (unsigned int)__entry->multi_cycles, (unsigned int)__entry->mode, @@ -868,11 +872,95 @@ DECLARE_EVENT_CLASS(cpu_modes, DEFINE_EVENT(cpu_modes, cpu_mode_detect, TP_PROTO(unsigned int cpu, unsigned int max_load, - unsigned int single_cycles, unsigned int total_load, - unsigned int multi_cycles, unsigned int mode, - unsigned int cpu_cnt), - TP_ARGS(cpu, max_load, single_cycles, total_load, multi_cycles, - mode, cpu_cnt) + unsigned int single_enter_cycle_cnt, + unsigned int single_exit_cycle_cnt, + unsigned int total_load, unsigned int multi_cycles, + unsigned int mode, unsigned int cpu_cnt), + TP_ARGS(cpu, max_load, single_enter_cycle_cnt, single_exit_cycle_cnt, + total_load, multi_cycles, mode, cpu_cnt) +); + +DECLARE_EVENT_CLASS(timer_status, + TP_PROTO(unsigned int cpu, unsigned int single_enter_cycles, + unsigned int single_enter_cycle_cnt, + unsigned int single_exit_cycles, + unsigned int single_exit_cycle_cnt, unsigned int multi_cycles, + unsigned int multi_cycle_cnt, unsigned int timer_rate, + unsigned int mode), + TP_ARGS(cpu, single_enter_cycles, single_enter_cycle_cnt, + single_exit_cycles, single_exit_cycle_cnt, multi_cycles, + multi_cycle_cnt, timer_rate, mode), + + TP_STRUCT__entry( + __field(unsigned int, cpu) + __field(unsigned int, single_enter_cycles) + __field(unsigned int, single_enter_cycle_cnt) + __field(unsigned int, single_exit_cycles) + __field(unsigned int, single_exit_cycle_cnt) + __field(unsigned int, multi_cycles) + __field(unsigned int, multi_cycle_cnt) + __field(unsigned int, timer_rate) + __field(unsigned int, mode) + ), + + TP_fast_assign( + __entry->cpu = cpu; + __entry->single_enter_cycles = single_enter_cycles; + __entry->single_enter_cycle_cnt = single_enter_cycle_cnt; + __entry->single_exit_cycles = single_exit_cycles; + __entry->single_exit_cycle_cnt = single_exit_cycle_cnt; + __entry->multi_cycles = multi_cycles; + __entry->multi_cycle_cnt = multi_cycle_cnt; + __entry->timer_rate = timer_rate; + __entry->mode = mode; + ), + + TP_printk("%u:%4u:%4u:%4u:%4u:%4u:%4u:%4u:%4u", + __entry->cpu, + __entry->single_enter_cycles, + __entry->single_enter_cycle_cnt, + __entry->single_exit_cycles, + __entry->single_exit_cycle_cnt, + __entry->multi_cycles, + __entry->multi_cycle_cnt, + __entry->timer_rate, + __entry->mode) +); + +DEFINE_EVENT(timer_status, single_mode_timeout, + TP_PROTO(unsigned int cpu, unsigned int single_enter_cycles, + unsigned int single_enter_cycle_cnt, + unsigned int single_exit_cycles, + unsigned int single_exit_cycle_cnt, unsigned int multi_cycles, + unsigned int multi_cycle_cnt, unsigned int timer_rate, + unsigned int mode), + TP_ARGS(cpu, single_enter_cycles, single_enter_cycle_cnt, + single_exit_cycles, single_exit_cycle_cnt, multi_cycles, + multi_cycle_cnt, timer_rate, mode) +); + +DEFINE_EVENT(timer_status, single_cycle_exit_timer_start, + TP_PROTO(unsigned int cpu, unsigned int single_enter_cycles, + unsigned int single_enter_cycle_cnt, + unsigned int single_exit_cycles, + unsigned int single_exit_cycle_cnt, unsigned int multi_cycles, + unsigned int multi_cycle_cnt, unsigned int timer_rate, + unsigned int mode), + TP_ARGS(cpu, single_enter_cycles, single_enter_cycle_cnt, + single_exit_cycles, single_exit_cycle_cnt, multi_cycles, + multi_cycle_cnt, timer_rate, mode) +); + +DEFINE_EVENT(timer_status, single_cycle_exit_timer_stop, + TP_PROTO(unsigned int cpu, unsigned int single_enter_cycles, + unsigned int single_enter_cycle_cnt, + unsigned int single_exit_cycles, + unsigned int single_exit_cycle_cnt, unsigned int multi_cycles, + unsigned int multi_cycle_cnt, unsigned int timer_rate, + unsigned int mode), + TP_ARGS(cpu, single_enter_cycles, single_enter_cycle_cnt, + single_exit_cycles, single_exit_cycle_cnt, multi_cycles, + multi_cycle_cnt, timer_rate, mode) ); #endif /* _TRACE_POWER_H */ |
