All of lore.kernel.org
 help / color / mirror / Atom feed
From: Peter Zijlstra <peterz@infradead.org>
To: tglx@linutronix.de, mingo@kernel.org, juri.lelli@redhat.com,
	vincent.guittot@linaro.org, dietmar.eggemann@arm.com,
	rostedt@goodmis.org, bsegall@google.com, mgorman@suse.de,
	bristot@redhat.com, bsingharora@gmail.com, pbonzini@redhat.com,
	maz@kernel.org
Cc: linux-kernel@vger.kernel.org, kvm@vger.kernel.org,
	peterz@infradead.org, riel@surriel.com, hannes@cmpxchg.org
Subject: [PATCH 3/6] sched: Simplify sched_info_on()
Date: Wed, 05 May 2021 12:59:43 +0200	[thread overview]
Message-ID: <20210505111525.121458839@infradead.org> (raw)
In-Reply-To: 20210505105940.190490250@infradead.org

The situation around sched_info is somewhat complicated, it is used by
sched_stats and delayacct and, indirectly, kvm.

If SCHEDSTATS=Y (but disabled by default) sched_info_on() is
unconditionally true -- this is the case for all distro kernel configs
I checked.

If for some reason SCHEDSTATS=N, but TASK_DELAY_ACCT=Y, then
sched_info_on() can return false when delayacct is disabled,
presumably because there would be no other users left; except kvm is.

Instead of complicating matters further by accurately accounting
sched_stat and kvm state, simply unconditionally enable when
SCHED_INFO=Y, matching the common distro case.

Signed-off-by: Peter Zijlstra (Intel) <peterz@infradead.org>
---
 include/linux/sched/stat.h |   10 ++--------
 kernel/delayacct.c         |    1 -
 kernel/sched/stats.h       |   37 ++++++++++---------------------------
 3 files changed, 12 insertions(+), 36 deletions(-)

--- a/include/linux/sched/stat.h
+++ b/include/linux/sched/stat.h
@@ -3,6 +3,7 @@
 #define _LINUX_SCHED_STAT_H
 
 #include <linux/percpu.h>
+#include <linux/kconfig.h>
 
 /*
  * Various counters maintained by the scheduler and fork(),
@@ -23,14 +24,7 @@ extern unsigned long nr_iowait_cpu(int c
 
 static inline int sched_info_on(void)
 {
-#ifdef CONFIG_SCHEDSTATS
-	return 1;
-#elif defined(CONFIG_TASK_DELAY_ACCT)
-	extern int delayacct_on;
-	return delayacct_on;
-#else
-	return 0;
-#endif
+	return IS_ENABLED(CONFIG_SCHED_INFO);
 }
 
 #ifdef CONFIG_SCHEDSTATS
--- a/kernel/delayacct.c
+++ b/kernel/delayacct.c
@@ -15,7 +15,6 @@
 #include <linux/module.h>
 
 int delayacct_on __read_mostly = 1;	/* Delay accounting turned on/off */
-EXPORT_SYMBOL_GPL(delayacct_on);
 struct kmem_cache *delayacct_cache;
 
 static int __init delayacct_setup_disable(char *str)
--- a/kernel/sched/stats.h
+++ b/kernel/sched/stats.h
@@ -150,11 +150,6 @@ static inline void psi_sched_switch(stru
 #endif /* CONFIG_PSI */
 
 #ifdef CONFIG_SCHED_INFO
-static inline void sched_info_reset_dequeued(struct task_struct *t)
-{
-	t->sched_info.last_queued = 0;
-}
-
 /*
  * We are interested in knowing how long it was from the *first* time a
  * task was queued to the time that it finally hit a CPU, we call this routine
@@ -163,13 +158,12 @@ static inline void sched_info_reset_dequ
  */
 static inline void sched_info_dequeue(struct rq *rq, struct task_struct *t)
 {
-	unsigned long long now = rq_clock(rq), delta = 0;
+	unsigned long long delta = 0;
 
-	if (sched_info_on()) {
-		if (t->sched_info.last_queued)
-			delta = now - t->sched_info.last_queued;
+	if (t->sched_info.last_queued) {
+		delta = rq_clock(rq) - t->sched_info.last_queued;
+		t->sched_info.last_queued = 0;
 	}
-	sched_info_reset_dequeued(t);
 	t->sched_info.run_delay += delta;
 
 	rq_sched_info_dequeue(rq, delta);
@@ -184,9 +178,10 @@ static void sched_info_arrive(struct rq
 {
 	unsigned long long now = rq_clock(rq), delta = 0;
 
-	if (t->sched_info.last_queued)
+	if (t->sched_info.last_queued) {
 		delta = now - t->sched_info.last_queued;
-	sched_info_reset_dequeued(t);
+		t->sched_info.last_queued = 0;
+	}
 	t->sched_info.run_delay += delta;
 	t->sched_info.last_arrival = now;
 	t->sched_info.pcount++;
@@ -201,10 +196,8 @@ static void sched_info_arrive(struct rq
  */
 static inline void sched_info_enqueue(struct rq *rq, struct task_struct *t)
 {
-	if (sched_info_on()) {
-		if (!t->sched_info.last_queued)
-			t->sched_info.last_queued = rq_clock(rq);
-	}
+	if (!t->sched_info.last_queued)
+		t->sched_info.last_queued = rq_clock(rq);
 }
 
 /*
@@ -231,7 +224,7 @@ static inline void sched_info_depart(str
  * the idle task.)  We are only called when prev != next.
  */
 static inline void
-__sched_info_switch(struct rq *rq, struct task_struct *prev, struct task_struct *next)
+sched_info_switch(struct rq *rq, struct task_struct *prev, struct task_struct *next)
 {
 	/*
 	 * prev now departs the CPU.  It's not interesting to record
@@ -245,18 +238,8 @@ __sched_info_switch(struct rq *rq, struc
 		sched_info_arrive(rq, next);
 }
 
-static inline void
-sched_info_switch(struct rq *rq, struct task_struct *prev, struct task_struct *next)
-{
-	if (sched_info_on())
-		__sched_info_switch(rq, prev, next);
-}
-
 #else /* !CONFIG_SCHED_INFO: */
 # define sched_info_enqueue(rq, t)	do { } while (0)
-# define sched_info_reset_dequeued(t)	do { } while (0)
 # define sched_info_dequeue(rq, t)	do { } while (0)
-# define sched_info_depart(rq, t)	do { } while (0)
-# define sched_info_arrive(rq, next)	do { } while (0)
 # define sched_info_switch(rq, t, next)	do { } while (0)
 #endif /* CONFIG_SCHED_INFO */



  parent reply	other threads:[~2021-05-05 11:18 UTC|newest]

Thread overview: 51+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2021-05-05 10:59 [PATCH 0/6] sched,delayacct: Some cleanups Peter Zijlstra
2021-05-05 10:59 ` [PATCH 1/6] delayacct: Use sched_clock() Peter Zijlstra
2021-05-05 14:40   ` Rik van Riel
2021-05-06 13:59   ` Johannes Weiner
2021-05-06 14:17     ` Peter Zijlstra
2021-05-06 15:17       ` Johannes Weiner
2021-05-07 12:40   ` Balbir Singh
2021-05-12 10:28   ` [tip: sched/core] " tip-bot2 for Peter Zijlstra
2021-05-12 10:43   ` [PATCH 1/6] " Mel Gorman
2021-05-05 10:59 ` [PATCH 2/6] sched: Rename sched_info_{queued,dequeued} Peter Zijlstra
2021-05-05 14:39   ` Rik van Riel
2021-05-06 13:59   ` Johannes Weiner
2021-05-10  8:45   ` Balbir Singh
2021-05-12 10:28   ` [tip: sched/core] " tip-bot2 for Peter Zijlstra
2021-05-12 10:49   ` [PATCH 2/6] " Mel Gorman
2021-05-05 10:59 ` Peter Zijlstra [this message]
2021-05-06 14:03   ` [PATCH 3/6] sched: Simplify sched_info_on() Johannes Weiner
2021-05-12 10:28   ` [tip: sched/core] " tip-bot2 for Peter Zijlstra
2021-05-12 11:10   ` [PATCH 3/6] " Mel Gorman
2021-05-12 11:32     ` Peter Zijlstra
2021-05-12 12:51       ` Mel Gorman
2021-05-05 10:59 ` [PATCH 4/6] kvm: Select SCHED_INFO instead of TASK_DELAY_ACCT Peter Zijlstra
2021-05-05 11:37   ` Paolo Bonzini
2021-05-06 14:38   ` Marc Zyngier
2021-05-07 12:42   ` Balbir Singh
2021-05-12 10:28   ` [tip: sched/core] " tip-bot2 for Peter Zijlstra
2021-05-12 11:11   ` [PATCH 4/6] " Mel Gorman
2021-05-05 10:59 ` [PATCH 5/6] delayacct: Add static_branch in scheduler hooks Peter Zijlstra
2021-05-06 14:05   ` Johannes Weiner
2021-05-10  8:42   ` Balbir Singh
2021-05-12 10:28   ` [tip: sched/core] " tip-bot2 for Peter Zijlstra
2021-05-12 11:13   ` [PATCH 5/6] " Mel Gorman
2021-05-05 10:59 ` [PATCH 6/6] [RFC] delayacct: Default disabled Peter Zijlstra
2021-05-12 10:28   ` [tip: sched/core] " tip-bot2 for Peter Zijlstra
2021-05-12 11:35   ` [PATCH 6/6] [RFC] " Mel Gorman
2021-05-05 22:29 ` [PATCH 0/6] sched,delayacct: Some cleanups Balbir Singh
2021-05-06  9:13   ` Peter Zijlstra
2021-05-07 12:38     ` Balbir Singh
2021-05-12 11:34       ` Mel Gorman
2021-05-12 11:38         ` Peter Zijlstra
2021-05-12 12:23         ` Paul Wise
2021-05-12 13:00           ` Mel Gorman
2021-05-13  1:29             ` Paul Wise
2021-06-25  0:50         ` Paul Wise
2021-05-07  9:05 ` Thomas Gleixner
2021-05-10  7:08 ` Ingo Molnar
2021-05-10 12:05 ` [PATCH 7/6] delayacct: Add sysctl to enable at runtime Peter Zijlstra
2021-05-10 12:06   ` Peter Zijlstra
2021-05-12 10:28   ` [tip: sched/core] " tip-bot2 for Peter Zijlstra
2021-05-12 11:40   ` [PATCH 7/6] " Mel Gorman
2021-05-19  8:09     ` [tip: sched/core] delayacct: Document task_delayacct sysctl tip-bot2 for Mel Gorman

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20210505111525.121458839@infradead.org \
    --to=peterz@infradead.org \
    --cc=bristot@redhat.com \
    --cc=bsegall@google.com \
    --cc=bsingharora@gmail.com \
    --cc=dietmar.eggemann@arm.com \
    --cc=hannes@cmpxchg.org \
    --cc=juri.lelli@redhat.com \
    --cc=kvm@vger.kernel.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=maz@kernel.org \
    --cc=mgorman@suse.de \
    --cc=mingo@kernel.org \
    --cc=pbonzini@redhat.com \
    --cc=riel@surriel.com \
    --cc=rostedt@goodmis.org \
    --cc=tglx@linutronix.de \
    --cc=vincent.guittot@linaro.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.