cpufreq: trace frequency limits change
authorRuchi Kandoi <kandoiruchi@google.com>
Tue, 24 Jul 2018 17:35:44 +0000 (10:35 -0700)
committerRafael J. Wysocki <rafael.j.wysocki@intel.com>
Thu, 26 Jul 2018 08:17:47 +0000 (10:17 +0200)
systrace used for tracing for Android systems has carried a patch for
many years in the Android tree that traces when the cpufreq limits
change.  With the help of this information, systrace can know when the
policy limits change and can visually display the data. Lets add
upstream support for the same.

Signed-off-by: Ruchi Kandoi <kandoiruchi@google.com>
Signed-off-by: Joel Fernandes (Google) <joel@joelfernandes.org>
Acked-by: Viresh Kumar <viresh.kumar@linaro.org>
Acked-by: Steven Rostedt (VMware) <rostedt@goodmis.org>
Signed-off-by: Rafael J. Wysocki <rafael.j.wysocki@intel.com>
Documentation/trace/events-power.rst
drivers/cpufreq/cpufreq.c
include/trace/events/power.h

index a77daca75e30404aec0c6d4924f10ca5310e6a1f..2ef318962e292bd08368a719a460fc61ebd9cb0b 100644 (file)
@@ -27,6 +27,7 @@ cpufreq.
 
   cpu_idle             "state=%lu cpu_id=%lu"
   cpu_frequency                "state=%lu cpu_id=%lu"
+  cpu_frequency_limits "min=%lu max=%lu cpu_id=%lu"
 
 A suspend event is used to indicate the system going in and out of the
 suspend mode:
index b0dfd3222013d5d1051435feda7220adc2f36b0c..52566f1f10506315074fab424a14e16131266096 100644 (file)
@@ -2236,6 +2236,7 @@ static int cpufreq_set_policy(struct cpufreq_policy *policy,
 
        policy->min = new_policy->min;
        policy->max = new_policy->max;
+       trace_cpu_frequency_limits(policy);
 
        policy->cached_target_freq = UINT_MAX;
 
index 908977d69783b8e4ba1c1f775a5c51bc9f0befd7..f7aece721aed75dfe7d36beae56da0eb2cdafc65 100644 (file)
@@ -5,6 +5,7 @@
 #if !defined(_TRACE_POWER_H) || defined(TRACE_HEADER_MULTI_READ)
 #define _TRACE_POWER_H
 
+#include <linux/cpufreq.h>
 #include <linux/ktime.h>
 #include <linux/pm_qos.h>
 #include <linux/tracepoint.h>
@@ -148,6 +149,30 @@ DEFINE_EVENT(cpu, cpu_frequency,
        TP_ARGS(frequency, cpu_id)
 );
 
+TRACE_EVENT(cpu_frequency_limits,
+
+       TP_PROTO(struct cpufreq_policy *policy),
+
+       TP_ARGS(policy),
+
+       TP_STRUCT__entry(
+               __field(u32, min_freq)
+               __field(u32, max_freq)
+               __field(u32, cpu_id)
+       ),
+
+       TP_fast_assign(
+               __entry->min_freq = policy->min;
+               __entry->max_freq = policy->max;
+               __entry->cpu_id = policy->cpu;
+       ),
+
+       TP_printk("min=%lu max=%lu cpu_id=%lu",
+                 (unsigned long)__entry->min_freq,
+                 (unsigned long)__entry->max_freq,
+                 (unsigned long)__entry->cpu_id)
+);
+
 TRACE_EVENT(device_pm_callback_start,
 
        TP_PROTO(struct device *dev, const char *pm_ops, int event),