summaryrefslogtreecommitdiff
path: root/include/trace/events
diff options
context:
space:
mode:
authorTapas Kumar Kundu <tkundu@codeaurora.org>2015-04-19 20:01:27 -0700
committerDavid Keitel <dkeitel@codeaurora.org>2016-03-23 21:22:28 -0700
commite85e0f6452f41392ecff7063798319c5019d1750 (patch)
treef85ec34cfc4810963dbbb7fe399bd35ed607f2be /include/trace/events
parent010aa5bd7cdeee25c1f2290c7ebb62fe2ab8a16c (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.h116
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 */