sched/cpufreq_sched: add trace events
authorSteve Muckle <smuckle@linaro.org>
Wed, 25 Nov 2015 23:59:25 +0000 (15:59 -0800)
committerLeo Yan <leo.yan@linaro.org>
Tue, 10 May 2016 08:53:23 +0000 (16:53 +0800)
Trace events will aid in debugging, profiling and tuning.

Signed-off-by: Steve Muckle <smuckle@linaro.org>
include/trace/events/cpufreq_sched.h [new file with mode: 0644]
kernel/sched/cpufreq_sched.c

diff --git a/include/trace/events/cpufreq_sched.h b/include/trace/events/cpufreq_sched.h
new file mode 100644 (file)
index 0000000..a46cd08
--- /dev/null
@@ -0,0 +1,87 @@
+/*
+ *  Copyright (C)  2015 Steve Muckle <smuckle@linaro.org>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation.
+ */
+
+#undef TRACE_SYSTEM
+#define TRACE_SYSTEM cpufreq_sched
+
+#if !defined(_TRACE_CPUFREQ_SCHED_H) || defined(TRACE_HEADER_MULTI_READ)
+#define _TRACE_CPUFREQ_SCHED_H
+
+#include <linux/sched.h>
+#include <linux/tracepoint.h>
+
+TRACE_EVENT(cpufreq_sched_throttled,
+           TP_PROTO(unsigned int rem),
+           TP_ARGS(rem),
+           TP_STRUCT__entry(
+                   __field(    unsigned int,   rem)
+           ),
+           TP_fast_assign(
+                   __entry->rem = rem;
+           ),
+           TP_printk("throttled - %d usec remaining", __entry->rem)
+);
+
+TRACE_EVENT(cpufreq_sched_request_opp,
+           TP_PROTO(int cpu,
+                    unsigned long capacity,
+                    unsigned int freq_new,
+                    unsigned int requested_freq),
+           TP_ARGS(cpu, capacity, freq_new, requested_freq),
+           TP_STRUCT__entry(
+                   __field(    int,            cpu)
+                   __field(    unsigned long,  capacity)
+                   __field(    unsigned int,   freq_new)
+                   __field(    unsigned int,   requested_freq)
+                   ),
+           TP_fast_assign(
+                   __entry->cpu = cpu;
+                   __entry->capacity = capacity;
+                   __entry->freq_new = freq_new;
+                   __entry->requested_freq = requested_freq;
+                   ),
+           TP_printk("cpu %d cap change, cluster cap request %ld => OPP %d "
+                     "(cur %d)",
+                     __entry->cpu, __entry->capacity, __entry->freq_new,
+                     __entry->requested_freq)
+);
+
+TRACE_EVENT(cpufreq_sched_update_capacity,
+           TP_PROTO(int cpu,
+                    bool request,
+                    struct sched_capacity_reqs *scr,
+                    unsigned long new_capacity),
+           TP_ARGS(cpu, request, scr, new_capacity),
+           TP_STRUCT__entry(
+                   __field(    int,            cpu)
+                   __field(    bool,           request)
+                   __field(    unsigned long,  cfs)
+                   __field(    unsigned long,  rt)
+                   __field(    unsigned long,  dl)
+                   __field(    unsigned long,  total)
+                   __field(    unsigned long,  new_total)
+           ),
+           TP_fast_assign(
+                   __entry->cpu = cpu;
+                   __entry->request = request;
+                   __entry->cfs = scr->cfs;
+                   __entry->rt = scr->rt;
+                   __entry->dl = scr->dl;
+                   __entry->total = scr->total;
+                   __entry->new_total = new_capacity;
+           ),
+           TP_printk("cpu=%d set_cap=%d cfs=%ld rt=%ld dl=%ld old_tot=%ld "
+                     "new_tot=%ld",
+                     __entry->cpu, __entry->request, __entry->cfs, __entry->rt,
+                     __entry->dl, __entry->total, __entry->new_total)
+);
+
+#endif /* _TRACE_CPUFREQ_SCHED_H */
+
+/* This part must be outside protection */
+#include <trace/define_trace.h>
index 58bca8d2ca653e487e8a25bef4846834133d6bfa..5afe56a82491425a69930534d4991dba2add6adb 100644 (file)
@@ -14,6 +14,9 @@
 #include <linux/delay.h>
 #include <linux/string.h>
 
+#define CREATE_TRACE_POINTS
+#include <trace/events/cpufreq_sched.h>
+
 #include "sched.h"
 
 #define THROTTLE_NSEC          50000000 /* 50ms default */
@@ -78,6 +81,7 @@ static bool finish_last_request(struct gov_data *gd)
                int usec_left = ktime_to_ns(ktime_sub(gd->throttle, now));
 
                usec_left /= NSEC_PER_USEC;
+               trace_cpufreq_sched_throttled(usec_left);
                usleep_range(usec_left, usec_left + 100);
                now = ktime_get();
                if (ktime_after(now, gd->throttle))
@@ -186,6 +190,9 @@ static void update_fdomain_capacity_request(int cpu)
                goto out;
        freq_new = policy->freq_table[index_new].frequency;
 
+       trace_cpufreq_sched_request_opp(cpu, capacity, freq_new,
+                                       gd->requested_freq);
+
        if (freq_new == gd->requested_freq)
                goto out;
 
@@ -222,6 +229,8 @@ void update_cpu_capacity_request(int cpu, bool request)
        if (new_capacity == scr->total)
                return;
 
+       trace_cpufreq_sched_update_capacity(cpu, request, scr, new_capacity);
+
        scr->total = new_capacity;
        if (request)
                update_fdomain_capacity_request(cpu);