diff --git a/devlib/bin/scripts/shutils.in b/devlib/bin/scripts/shutils.in index 799461f..b95ad2e 100755 --- a/devlib/bin/scripts/shutils.in +++ b/devlib/bin/scripts/shutils.in @@ -46,6 +46,18 @@ cpufreq_trace_all_frequencies() { done } +################################################################################ +# CPUIdle Utility Functions +################################################################################ + +cpuidle_wake_all_cpus() { + CPU_PATHS=/sys/devices/system/cpu/cpu[0-9]* + MASK=0x1; for F in $CPU_PATHS; do + $BUSYBOX taskset $MASK true + MASK=$($BUSYBOX printf '0x%x' $((MASK * 2))) + done +} + ################################################################################ # FTrace Utility Functions ################################################################################ @@ -185,6 +197,9 @@ cpufreq_get_all_governors) cpufreq_trace_all_frequencies) cpufreq_trace_all_frequencies $* ;; +cpuidle_wake_all_cpus) + cpuidle_wake_all_cpus $* + ;; cgroups_get_attributes) cgroups_get_attributes $* ;; diff --git a/devlib/module/cpuidle.py b/devlib/module/cpuidle.py index 1ac06ff..3f1938d 100644 --- a/devlib/module/cpuidle.py +++ b/devlib/module/cpuidle.py @@ -152,3 +152,9 @@ class Cpuidle(Module): for state in self.get_states(cpu): state.disable() + def perturb_cpus(self): + """ + Momentarily wake each CPU. Ensures cpu_idle events in trace file. + """ + output = self.target._execute_util('cpuidle_wake_all_cpus') + print(output) diff --git a/devlib/trace/ftrace.py b/devlib/trace/ftrace.py index a40a5f4..7affed5 100644 --- a/devlib/trace/ftrace.py +++ b/devlib/trace/ftrace.py @@ -170,6 +170,9 @@ class FtraceCollector(TraceCollector): if 'cpufreq' in self.target.modules: self.logger.debug('Trace CPUFreq frequencies') self.target.cpufreq.trace_frequencies() + if 'cpuidle' in self.target.modules: + self.logger.debug('Trace CPUIdle states') + self.target.cpuidle.perturb_cpus() # Enable kernel function profiling if self.functions: self.target.execute('echo nop > {}'.format(self.current_tracer_file),