sched/debug: Add sched_overutilized tracepoint
authorQais Yousef <qais.yousef@arm.com>
Tue, 4 Jun 2019 11:14:58 +0000 (12:14 +0100)
committerIngo Molnar <mingo@kernel.org>
Mon, 24 Jun 2019 17:23:42 +0000 (19:23 +0200)
The new tracepoint allows us to track the changes in overutilized
status.

Overutilized status is associated with EAS. It indicates that the system
is in high performance state. EAS is disabled when the system is in this
state since there's not much energy savings while high performance tasks
are pushing the system to the limit and it's better to default to the
spreading behavior of the scheduler.

This tracepoint helps understanding and debugging the conditions under
which this happens.

Signed-off-by: Qais Yousef <qais.yousef@arm.com>
Signed-off-by: Peter Zijlstra (Intel) <peterz@infradead.org>
Cc: Dietmar Eggemann <dietmar.eggemann@arm.com>
Cc: Linus Torvalds <torvalds@linux-foundation.org>
Cc: Pavankumar Kondeti <pkondeti@codeaurora.org>
Cc: Peter Zijlstra <peterz@infradead.org>
Cc: Quentin Perret <quentin.perret@arm.com>
Cc: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
Cc: Steven Rostedt <rostedt@goodmis.org>
Cc: Thomas Gleixner <tglx@linutronix.de>
Cc: Uwe Kleine-Konig <u.kleine-koenig@pengutronix.de>
Link: https://lkml.kernel.org/r/20190604111459.2862-6-qais.yousef@arm.com
Signed-off-by: Ingo Molnar <mingo@kernel.org>
include/trace/events/sched.h
kernel/sched/fair.c

index c7dd9bc7f00179bff70b66afb2d7e3094428c11c..420e80e56e55198449563c781e4c1dbe4aa6be6d 100644 (file)
@@ -621,6 +621,10 @@ DECLARE_TRACE(pelt_se_tp,
        TP_PROTO(struct sched_entity *se),
        TP_ARGS(se));
 
+DECLARE_TRACE(sched_overutilized_tp,
+       TP_PROTO(struct root_domain *rd, bool overutilized),
+       TP_ARGS(rd, overutilized));
+
 #endif /* _TRACE_SCHED_H */
 
 /* This part must be outside protection */
index 75218ab1fa07f35e23ddac0c8f993c83d8c94462..11ec52709323def4b2c1dbaf32a3ad4293ff2894 100644 (file)
@@ -5181,8 +5181,10 @@ static inline bool cpu_overutilized(int cpu)
 
 static inline void update_overutilized_status(struct rq *rq)
 {
-       if (!READ_ONCE(rq->rd->overutilized) && cpu_overutilized(rq->cpu))
+       if (!READ_ONCE(rq->rd->overutilized) && cpu_overutilized(rq->cpu)) {
                WRITE_ONCE(rq->rd->overutilized, SG_OVERUTILIZED);
+               trace_sched_overutilized_tp(rq->rd, SG_OVERUTILIZED);
+       }
 }
 #else
 static inline void update_overutilized_status(struct rq *rq) { }
@@ -8214,8 +8216,12 @@ next_group:
 
                /* Update over-utilization (tipping point, U >= 0) indicator */
                WRITE_ONCE(rd->overutilized, sg_status & SG_OVERUTILIZED);
+               trace_sched_overutilized_tp(rd, sg_status & SG_OVERUTILIZED);
        } else if (sg_status & SG_OVERUTILIZED) {
-               WRITE_ONCE(env->dst_rq->rd->overutilized, SG_OVERUTILIZED);
+               struct root_domain *rd = env->dst_rq->rd;
+
+               WRITE_ONCE(rd->overutilized, SG_OVERUTILIZED);
+               trace_sched_overutilized_tp(rd, SG_OVERUTILIZED);
        }
 }