* [tip: sched/core] sched/fair: Rename SG_OVERLOAD to SG_OVERLOADED
2024-03-28 10:34 ` Ingo Molnar
@ 2024-03-28 10:56 ` tip-bot2 for Ingo Molnar
2024-03-28 10:56 ` [tip: sched/core] sched/fair: Rename {set|get}_rd_overload() to {set|get}_rd_overloaded() tip-bot2 for Ingo Molnar
` (4 subsequent siblings)
5 siblings, 0 replies; 18+ messages in thread
From: tip-bot2 for Ingo Molnar @ 2024-03-28 10:56 UTC (permalink / raw)
To: linux-tip-commits
Cc: Ingo Molnar, Qais Yousef, Shrikanth Hegde, Vincent Guittot,
Peter Zijlstra, x86, linux-kernel
The following commit has been merged into the sched/core branch of tip:
Commit-ID: 7bda10ba7f453729f210264dd07d38989fb858d9
Gitweb: https://git.kernel.org/tip/7bda10ba7f453729f210264dd07d38989fb858d9
Author: Ingo Molnar <mingo@kernel.org>
AuthorDate: Thu, 28 Mar 2024 11:44:16 +01:00
Committer: Ingo Molnar <mingo@kernel.org>
CommitterDate: Thu, 28 Mar 2024 11:44:44 +01:00
sched/fair: Rename SG_OVERLOAD to SG_OVERLOADED
Follow the rename of the root_domain::overloaded flag.
Note that this also matches the SG_OVERUTILIZED flag better.
Signed-off-by: Ingo Molnar <mingo@kernel.org>
Cc: Qais Yousef <qyousef@layalina.io>
Cc: Shrikanth Hegde <sshegde@linux.ibm.com>
Cc: Vincent Guittot <vincent.guittot@linaro.org>
Cc: Peter Zijlstra <peterz@infradead.org>
Link: https://lore.kernel.org/r/ZgVHq65XKsOZpfgK@gmail.com
---
kernel/sched/fair.c | 6 +++---
kernel/sched/sched.h | 4 ++--
2 files changed, 5 insertions(+), 5 deletions(-)
diff --git a/kernel/sched/fair.c b/kernel/sched/fair.c
index bf10665..839a97a 100644
--- a/kernel/sched/fair.c
+++ b/kernel/sched/fair.c
@@ -9961,7 +9961,7 @@ static inline void update_sg_lb_stats(struct lb_env *env,
sgs->sum_nr_running += nr_running;
if (nr_running > 1)
- *sg_status |= SG_OVERLOAD;
+ *sg_status |= SG_OVERLOADED;
if (cpu_overutilized(i))
*sg_status |= SG_OVERUTILIZED;
@@ -9986,7 +9986,7 @@ static inline void update_sg_lb_stats(struct lb_env *env,
/* Check for a misfit task on the cpu */
if (sgs->group_misfit_task_load < rq->misfit_task_load) {
sgs->group_misfit_task_load = rq->misfit_task_load;
- *sg_status |= SG_OVERLOAD;
+ *sg_status |= SG_OVERLOADED;
}
} else if (env->idle && sched_reduced_capacity(rq, env->sd)) {
/* Check for a task running on a CPU with reduced capacity */
@@ -10657,7 +10657,7 @@ static inline void update_sd_lb_stats(struct lb_env *env, struct sd_lb_stats *sd
if (!env->sd->parent) {
/* update overload indicator if we are at root domain */
- set_rd_overloaded(env->dst_rq->rd, sg_status & SG_OVERLOAD);
+ set_rd_overloaded(env->dst_rq->rd, sg_status & SG_OVERLOADED);
/* Update over-utilization (tipping point, U >= 0) indicator */
set_rd_overutilized_status(env->dst_rq->rd,
diff --git a/kernel/sched/sched.h b/kernel/sched/sched.h
index c7e7ae1..07c6669 100644
--- a/kernel/sched/sched.h
+++ b/kernel/sched/sched.h
@@ -851,7 +851,7 @@ struct perf_domain {
};
/* Scheduling group status flags */
-#define SG_OVERLOAD 0x1 /* More than one runnable task on a CPU. */
+#define SG_OVERLOADED 0x1 /* More than one runnable task on a CPU. */
#define SG_OVERUTILIZED 0x2 /* One or more CPUs are over-utilized. */
/*
@@ -2541,7 +2541,7 @@ static inline void add_nr_running(struct rq *rq, unsigned count)
#ifdef CONFIG_SMP
if (prev_nr < 2 && rq->nr_running >= 2) {
- set_rd_overloaded(rq->rd, SG_OVERLOAD);
+ set_rd_overloaded(rq->rd, SG_OVERLOADED);
}
#endif
^ permalink raw reply related [flat|nested] 18+ messages in thread* [tip: sched/core] sched/fair: Rename {set|get}_rd_overload() to {set|get}_rd_overloaded()
2024-03-28 10:34 ` Ingo Molnar
2024-03-28 10:56 ` [tip: sched/core] sched/fair: Rename SG_OVERLOAD to SG_OVERLOADED tip-bot2 for Ingo Molnar
@ 2024-03-28 10:56 ` tip-bot2 for Ingo Molnar
2024-03-28 10:56 ` [tip: sched/core] sched/fair: Rename root_domain::overload to ::overloaded tip-bot2 for Ingo Molnar
` (3 subsequent siblings)
5 siblings, 0 replies; 18+ messages in thread
From: tip-bot2 for Ingo Molnar @ 2024-03-28 10:56 UTC (permalink / raw)
To: linux-tip-commits
Cc: Ingo Molnar, Qais Yousef, Shrikanth Hegde, Vincent Guittot,
Peter Zijlstra, x86, linux-kernel
The following commit has been merged into the sched/core branch of tip:
Commit-ID: 76cc4f91488af0a808bec97794bfe434dece7d67
Gitweb: https://git.kernel.org/tip/76cc4f91488af0a808bec97794bfe434dece7d67
Author: Ingo Molnar <mingo@kernel.org>
AuthorDate: Thu, 28 Mar 2024 11:41:31 +01:00
Committer: Ingo Molnar <mingo@kernel.org>
CommitterDate: Thu, 28 Mar 2024 11:41:31 +01:00
sched/fair: Rename {set|get}_rd_overload() to {set|get}_rd_overloaded()
Follow the rename of the root_domain::overloaded flag.
Signed-off-by: Ingo Molnar <mingo@kernel.org>
Cc: Qais Yousef <qyousef@layalina.io>
Cc: Shrikanth Hegde <sshegde@linux.ibm.com>
Cc: Vincent Guittot <vincent.guittot@linaro.org>
Cc: Peter Zijlstra <peterz@infradead.org>
Link: https://lore.kernel.org/r/ZgVHq65XKsOZpfgK@gmail.com
---
kernel/sched/fair.c | 4 ++--
kernel/sched/sched.h | 8 ++++----
2 files changed, 6 insertions(+), 6 deletions(-)
diff --git a/kernel/sched/fair.c b/kernel/sched/fair.c
index 0cc0582..bf10665 100644
--- a/kernel/sched/fair.c
+++ b/kernel/sched/fair.c
@@ -10657,7 +10657,7 @@ static inline void update_sd_lb_stats(struct lb_env *env, struct sd_lb_stats *sd
if (!env->sd->parent) {
/* update overload indicator if we are at root domain */
- set_rd_overload(env->dst_rq->rd, sg_status & SG_OVERLOAD);
+ set_rd_overloaded(env->dst_rq->rd, sg_status & SG_OVERLOAD);
/* Update over-utilization (tipping point, U >= 0) indicator */
set_rd_overutilized_status(env->dst_rq->rd,
@@ -12390,7 +12390,7 @@ static int sched_balance_newidle(struct rq *this_rq, struct rq_flags *rf)
rcu_read_lock();
sd = rcu_dereference_check_sched_domain(this_rq->sd);
- if (!get_rd_overload(this_rq->rd) ||
+ if (!get_rd_overloaded(this_rq->rd) ||
(sd && this_rq->avg_idle < sd->max_newidle_lb_cost)) {
if (sd)
diff --git a/kernel/sched/sched.h b/kernel/sched/sched.h
index cddc479..c7e7ae1 100644
--- a/kernel/sched/sched.h
+++ b/kernel/sched/sched.h
@@ -930,14 +930,14 @@ extern void rq_attach_root(struct rq *rq, struct root_domain *rd);
extern void sched_get_rd(struct root_domain *rd);
extern void sched_put_rd(struct root_domain *rd);
-static inline int get_rd_overload(struct root_domain *rd)
+static inline int get_rd_overloaded(struct root_domain *rd)
{
return READ_ONCE(rd->overloaded);
}
-static inline void set_rd_overload(struct root_domain *rd, int status)
+static inline void set_rd_overloaded(struct root_domain *rd, int status)
{
- if (get_rd_overload(rd) != status)
+ if (get_rd_overloaded(rd) != status)
WRITE_ONCE(rd->overloaded, status);
}
@@ -2541,7 +2541,7 @@ static inline void add_nr_running(struct rq *rq, unsigned count)
#ifdef CONFIG_SMP
if (prev_nr < 2 && rq->nr_running >= 2) {
- set_rd_overload(rq->rd, SG_OVERLOAD);
+ set_rd_overloaded(rq->rd, SG_OVERLOAD);
}
#endif
^ permalink raw reply related [flat|nested] 18+ messages in thread* [tip: sched/core] sched/fair: Rename root_domain::overload to ::overloaded
2024-03-28 10:34 ` Ingo Molnar
2024-03-28 10:56 ` [tip: sched/core] sched/fair: Rename SG_OVERLOAD to SG_OVERLOADED tip-bot2 for Ingo Molnar
2024-03-28 10:56 ` [tip: sched/core] sched/fair: Rename {set|get}_rd_overload() to {set|get}_rd_overloaded() tip-bot2 for Ingo Molnar
@ 2024-03-28 10:56 ` tip-bot2 for Ingo Molnar
2024-03-28 11:07 ` [PATCH v3 0/2] sched: Minor changes for rd->overload access Ingo Molnar
` (2 subsequent siblings)
5 siblings, 0 replies; 18+ messages in thread
From: tip-bot2 for Ingo Molnar @ 2024-03-28 10:56 UTC (permalink / raw)
To: linux-tip-commits
Cc: Ingo Molnar, Qais Yousef, Shrikanth Hegde, Vincent Guittot,
Peter Zijlstra, x86, linux-kernel
The following commit has been merged into the sched/core branch of tip:
Commit-ID: dfb83ef7b8b064c15be19cf7fcbde0996712de8f
Gitweb: https://git.kernel.org/tip/dfb83ef7b8b064c15be19cf7fcbde0996712de8f
Author: Ingo Molnar <mingo@kernel.org>
AuthorDate: Thu, 28 Mar 2024 11:33:20 +01:00
Committer: Ingo Molnar <mingo@kernel.org>
CommitterDate: Thu, 28 Mar 2024 11:38:58 +01:00
sched/fair: Rename root_domain::overload to ::overloaded
It is silly to use an ambiguous noun instead of a clear adjective when naming
such a flag ...
Note how root_domain::overutilized already used a proper adjective.
rd->overloaded is now set to 1 when the root domain is overloaded.
Signed-off-by: Ingo Molnar <mingo@kernel.org>
Cc: Qais Yousef <qyousef@layalina.io>
Cc: Shrikanth Hegde <sshegde@linux.ibm.com>
Cc: Vincent Guittot <vincent.guittot@linaro.org>
Cc: Peter Zijlstra <peterz@infradead.org>
Link: https://lore.kernel.org/r/ZgVHq65XKsOZpfgK@gmail.com
---
kernel/sched/sched.h | 6 +++---
1 file changed, 3 insertions(+), 3 deletions(-)
diff --git a/kernel/sched/sched.h b/kernel/sched/sched.h
index e86ee26..cddc479 100644
--- a/kernel/sched/sched.h
+++ b/kernel/sched/sched.h
@@ -874,7 +874,7 @@ struct root_domain {
* - More than one runnable task
* - Running task is misfit
*/
- int overload;
+ int overloaded;
/* Indicate one or more cpus over-utilized (tipping point) */
int overutilized;
@@ -932,13 +932,13 @@ extern void sched_put_rd(struct root_domain *rd);
static inline int get_rd_overload(struct root_domain *rd)
{
- return READ_ONCE(rd->overload);
+ return READ_ONCE(rd->overloaded);
}
static inline void set_rd_overload(struct root_domain *rd, int status)
{
if (get_rd_overload(rd) != status)
- WRITE_ONCE(rd->overload, status);
+ WRITE_ONCE(rd->overloaded, status);
}
#ifdef HAVE_RT_PUSH_IPI
^ permalink raw reply related [flat|nested] 18+ messages in thread* Re: [PATCH v3 0/2] sched: Minor changes for rd->overload access
2024-03-28 10:34 ` Ingo Molnar
` (2 preceding siblings ...)
2024-03-28 10:56 ` [tip: sched/core] sched/fair: Rename root_domain::overload to ::overloaded tip-bot2 for Ingo Molnar
@ 2024-03-28 11:07 ` Ingo Molnar
2024-03-28 17:19 ` Shrikanth Hegde
2024-03-28 12:01 ` [tip: sched/core] sched/fair: Rename set_rd_overutilized_status() to set_rd_overutilized() tip-bot2 for Ingo Molnar
2024-03-28 12:58 ` [PATCH v3 0/2] sched: Minor changes for rd->overload access Shrikanth Hegde
5 siblings, 1 reply; 18+ messages in thread
From: Ingo Molnar @ 2024-03-28 11:07 UTC (permalink / raw)
To: Shrikanth Hegde
Cc: peterz, vincent.guittot, dietmar.eggemann, qyousef, linux-kernel,
vschneid
* Ingo Molnar <mingo@kernel.org> wrote:
> Plus I've applied a patch to rename ::overload to ::overloaded. It is
> silly to use an ambiguous noun instead of a clear adjective when naming
> such a flag ...
Plus SG_OVERLOAD should be SG_OVERLOADED as well - it now looks in line
with SG_OVERUTILIZED:
/* Scheduling group status flags */
#define SG_OVERLOADED 0x1 /* More than one runnable task on a CPU. */
#define SG_OVERUTILIZED 0x2 /* One or more CPUs are over-utilized. */
My followup question is: why are these a bitmask, why not separate
flags?
AFAICS we only ever set them separately:
thule:~/tip> git grep SG_OVER kernel/sched/
kernel/sched/fair.c: set_rd_overutilized_status(rq->rd, SG_OVERUTILIZED);
kernel/sched/fair.c: *sg_status |= SG_OVERLOADED;
kernel/sched/fair.c: *sg_status |= SG_OVERUTILIZED;
kernel/sched/fair.c: *sg_status |= SG_OVERLOADED;
kernel/sched/fair.c: set_rd_overloaded(env->dst_rq->rd, sg_status & SG_OVERLOADED);
kernel/sched/fair.c: sg_status & SG_OVERUTILIZED);
kernel/sched/fair.c: } else if (sg_status & SG_OVERUTILIZED) {
kernel/sched/fair.c: set_rd_overutilized_status(env->dst_rq->rd, SG_OVERUTILIZED);
kernel/sched/sched.h:#define SG_OVERLOADED 0x1 /* More than one runnable task on a CPU. */
kernel/sched/sched.h:#define SG_OVERUTILIZED 0x2 /* One or more CPUs are over-utilized. */
kernel/sched/sched.h: set_rd_overloaded(rq->rd, SG_OVERLOADED);
In fact this results in suboptimal code:
/* update overload indicator if we are at root domain */
set_rd_overloaded(env->dst_rq->rd, sg_status & SG_OVERLOADED);
/* Update over-utilization (tipping point, U >= 0) indicator */
set_rd_overutilized_status(env->dst_rq->rd,
sg_status & SG_OVERUTILIZED);
Note how the bits that got mixed together in sg_status now have to be
masked out individually.
The sg_status bitmask appears to make no sense at all to me.
By turning these into individual bool flags we could also do away with
all the extra SG_OVERLOADED/SG_OVERUTILIZED abstraction.
Ie. something like the patch below? Untested.
Thanks,
Ingo
=================>
From: Ingo Molnar <mingo@kernel.org>
Date: Thu, 28 Mar 2024 12:00:14 +0100
Subject: [PATCH] sched/balancing: Simplify the sg_status bitmask and use separate ->overloaded and ->overutilized flags
SG_OVERLOADED and SG_OVERUTILIZED flags plus the sg_status bitmask are an
unnecessary complication that only make the code harder to read and slower.
We only ever set them separately:
thule:~/tip> git grep SG_OVER kernel/sched/
kernel/sched/fair.c: set_rd_overutilized_status(rq->rd, SG_OVERUTILIZED);
kernel/sched/fair.c: *sg_status |= SG_OVERLOADED;
kernel/sched/fair.c: *sg_status |= SG_OVERUTILIZED;
kernel/sched/fair.c: *sg_status |= SG_OVERLOADED;
kernel/sched/fair.c: set_rd_overloaded(env->dst_rq->rd, sg_status & SG_OVERLOADED);
kernel/sched/fair.c: sg_status & SG_OVERUTILIZED);
kernel/sched/fair.c: } else if (sg_status & SG_OVERUTILIZED) {
kernel/sched/fair.c: set_rd_overutilized_status(env->dst_rq->rd, SG_OVERUTILIZED);
kernel/sched/sched.h:#define SG_OVERLOADED 0x1 /* More than one runnable task on a CPU. */
kernel/sched/sched.h:#define SG_OVERUTILIZED 0x2 /* One or more CPUs are over-utilized. */
kernel/sched/sched.h: set_rd_overloaded(rq->rd, SG_OVERLOADED);
And use them separately, which results in suboptimal code:
/* update overload indicator if we are at root domain */
set_rd_overloaded(env->dst_rq->rd, sg_status & SG_OVERLOADED);
/* Update over-utilization (tipping point, U >= 0) indicator */
set_rd_overutilized_status(env->dst_rq->rd,
Introduce separate sg_overloaded and sg_overutilized flags in update_sd_lb_stats()
and its lower level functions, and change all of them to 'bool'.
Signed-off-by: Ingo Molnar <mingo@kernel.org>
---
kernel/sched/fair.c | 33 ++++++++++++++++-----------------
kernel/sched/sched.h | 17 ++++++-----------
2 files changed, 22 insertions(+), 28 deletions(-)
diff --git a/kernel/sched/fair.c b/kernel/sched/fair.c
index f29efd5f19f6..ebc8d5f855de 100644
--- a/kernel/sched/fair.c
+++ b/kernel/sched/fair.c
@@ -6688,19 +6688,18 @@ static inline bool cpu_overutilized(int cpu)
/*
* overutilized value make sense only if EAS is enabled
*/
-static inline int is_rd_overutilized(struct root_domain *rd)
+static inline bool is_rd_overutilized(struct root_domain *rd)
{
return !sched_energy_enabled() || READ_ONCE(rd->overutilized);
}
-static inline void set_rd_overutilized(struct root_domain *rd,
- unsigned int status)
+static inline void set_rd_overutilized(struct root_domain *rd, bool flag)
{
if (!sched_energy_enabled())
return;
- WRITE_ONCE(rd->overutilized, status);
- trace_sched_overutilized_tp(rd, !!status);
+ WRITE_ONCE(rd->overutilized, flag);
+ trace_sched_overutilized_tp(rd, flag);
}
static inline void check_update_overutilized_status(struct rq *rq)
@@ -6711,7 +6710,7 @@ static inline void check_update_overutilized_status(struct rq *rq)
*/
if (!is_rd_overutilized(rq->rd) && cpu_overutilized(rq->cpu))
- set_rd_overutilized(rq->rd, SG_OVERUTILIZED);
+ set_rd_overutilized(rq->rd, 1);
}
#else
static inline void check_update_overutilized_status(struct rq *rq) { }
@@ -9940,7 +9939,8 @@ static inline void update_sg_lb_stats(struct lb_env *env,
struct sd_lb_stats *sds,
struct sched_group *group,
struct sg_lb_stats *sgs,
- int *sg_status)
+ bool *sg_overloaded,
+ bool *sg_overutilized)
{
int i, nr_running, local_group;
@@ -9961,10 +9961,10 @@ static inline void update_sg_lb_stats(struct lb_env *env,
sgs->sum_nr_running += nr_running;
if (nr_running > 1)
- *sg_status |= SG_OVERLOADED;
+ *sg_overloaded = 1;
if (cpu_overutilized(i))
- *sg_status |= SG_OVERUTILIZED;
+ *sg_overutilized = 1;
#ifdef CONFIG_NUMA_BALANCING
sgs->nr_numa_running += rq->nr_numa_running;
@@ -9986,7 +9986,7 @@ static inline void update_sg_lb_stats(struct lb_env *env,
/* Check for a misfit task on the cpu */
if (sgs->group_misfit_task_load < rq->misfit_task_load) {
sgs->group_misfit_task_load = rq->misfit_task_load;
- *sg_status |= SG_OVERLOADED;
+ *sg_overloaded = 1;
}
} else if (env->idle && sched_reduced_capacity(rq, env->sd)) {
/* Check for a task running on a CPU with reduced capacity */
@@ -10612,7 +10612,7 @@ static inline void update_sd_lb_stats(struct lb_env *env, struct sd_lb_stats *sd
struct sg_lb_stats *local = &sds->local_stat;
struct sg_lb_stats tmp_sgs;
unsigned long sum_util = 0;
- int sg_status = 0;
+ bool sg_overloaded = 0, sg_overutilized = 0;
do {
struct sg_lb_stats *sgs = &tmp_sgs;
@@ -10628,7 +10628,7 @@ static inline void update_sd_lb_stats(struct lb_env *env, struct sd_lb_stats *sd
update_group_capacity(env->sd, env->dst_cpu);
}
- update_sg_lb_stats(env, sds, sg, sgs, &sg_status);
+ update_sg_lb_stats(env, sds, sg, sgs, &sg_overloaded, &sg_overutilized);
if (!local_group && update_sd_pick_busiest(env, sds, sg, sgs)) {
sds->busiest = sg;
@@ -10657,13 +10657,12 @@ static inline void update_sd_lb_stats(struct lb_env *env, struct sd_lb_stats *sd
if (!env->sd->parent) {
/* update overload indicator if we are at root domain */
- set_rd_overloaded(env->dst_rq->rd, sg_status & SG_OVERLOADED);
+ set_rd_overloaded(env->dst_rq->rd, sg_overloaded);
/* Update over-utilization (tipping point, U >= 0) indicator */
- set_rd_overutilized(env->dst_rq->rd,
- sg_status & SG_OVERUTILIZED);
- } else if (sg_status & SG_OVERUTILIZED) {
- set_rd_overutilized(env->dst_rq->rd, SG_OVERUTILIZED);
+ set_rd_overutilized(env->dst_rq->rd, sg_overloaded);
+ } else if (sg_overutilized) {
+ set_rd_overutilized(env->dst_rq->rd, sg_overutilized);
}
update_idle_cpu_scan(env, sum_util);
diff --git a/kernel/sched/sched.h b/kernel/sched/sched.h
index 07c6669b8250..7c39dbf31f75 100644
--- a/kernel/sched/sched.h
+++ b/kernel/sched/sched.h
@@ -713,7 +713,7 @@ struct rt_rq {
} highest_prio;
#endif
#ifdef CONFIG_SMP
- int overloaded;
+ bool overloaded;
struct plist_head pushable_tasks;
#endif /* CONFIG_SMP */
@@ -757,7 +757,7 @@ struct dl_rq {
u64 next;
} earliest_dl;
- int overloaded;
+ bool overloaded;
/*
* Tasks on this rq that can be pushed away. They are kept in
@@ -850,10 +850,6 @@ struct perf_domain {
struct rcu_head rcu;
};
-/* Scheduling group status flags */
-#define SG_OVERLOADED 0x1 /* More than one runnable task on a CPU. */
-#define SG_OVERUTILIZED 0x2 /* One or more CPUs are over-utilized. */
-
/*
* We add the notion of a root-domain which will be used to define per-domain
* variables. Each exclusive cpuset essentially defines an island domain by
@@ -874,10 +870,10 @@ struct root_domain {
* - More than one runnable task
* - Running task is misfit
*/
- int overloaded;
+ bool overloaded;
/* Indicate one or more cpus over-utilized (tipping point) */
- int overutilized;
+ bool overutilized;
/*
* The bit corresponding to a CPU gets set here if such CPU has more
@@ -2540,9 +2536,8 @@ static inline void add_nr_running(struct rq *rq, unsigned count)
}
#ifdef CONFIG_SMP
- if (prev_nr < 2 && rq->nr_running >= 2) {
- set_rd_overloaded(rq->rd, SG_OVERLOADED);
- }
+ if (prev_nr < 2 && rq->nr_running >= 2)
+ set_rd_overloaded(rq->rd, 1);
#endif
sched_update_tick_dependency(rq);
^ permalink raw reply related [flat|nested] 18+ messages in thread* Re: [PATCH v3 0/2] sched: Minor changes for rd->overload access
2024-03-28 11:07 ` [PATCH v3 0/2] sched: Minor changes for rd->overload access Ingo Molnar
@ 2024-03-28 17:19 ` Shrikanth Hegde
2024-03-29 6:55 ` Ingo Molnar
0 siblings, 1 reply; 18+ messages in thread
From: Shrikanth Hegde @ 2024-03-28 17:19 UTC (permalink / raw)
To: Ingo Molnar
Cc: peterz, vincent.guittot, dietmar.eggemann, qyousef, linux-kernel,
vschneid
On 3/28/24 4:37 PM, Ingo Molnar wrote:
>
> * Ingo Molnar <mingo@kernel.org> wrote:
>
>> Plus I've applied a patch to rename ::overload to ::overloaded. It is
>> silly to use an ambiguous noun instead of a clear adjective when naming
>> such a flag ...
>
> Plus SG_OVERLOAD should be SG_OVERLOADED as well - it now looks in line
> with SG_OVERUTILIZED:
>
> /* Scheduling group status flags */
> #define SG_OVERLOADED 0x1 /* More than one runnable task on a CPU. */
> #define SG_OVERUTILIZED 0x2 /* One or more CPUs are over-utilized. */
>
> My followup question is: why are these a bitmask, why not separate
> flags?
>
> AFAICS we only ever set them separately:
>
> thule:~/tip> git grep SG_OVER kernel/sched/
> kernel/sched/fair.c: set_rd_overutilized_status(rq->rd, SG_OVERUTILIZED);
> kernel/sched/fair.c: *sg_status |= SG_OVERLOADED;
> kernel/sched/fair.c: *sg_status |= SG_OVERUTILIZED;
> kernel/sched/fair.c: *sg_status |= SG_OVERLOADED;
> kernel/sched/fair.c: set_rd_overloaded(env->dst_rq->rd, sg_status & SG_OVERLOADED);
> kernel/sched/fair.c: sg_status & SG_OVERUTILIZED);
> kernel/sched/fair.c: } else if (sg_status & SG_OVERUTILIZED) {
> kernel/sched/fair.c: set_rd_overutilized_status(env->dst_rq->rd, SG_OVERUTILIZED);
> kernel/sched/sched.h:#define SG_OVERLOADED 0x1 /* More than one runnable task on a CPU. */
> kernel/sched/sched.h:#define SG_OVERUTILIZED 0x2 /* One or more CPUs are over-utilized. */
> kernel/sched/sched.h: set_rd_overloaded(rq->rd, SG_OVERLOADED);
>
> In fact this results in suboptimal code:
>
> /* update overload indicator if we are at root domain */
> set_rd_overloaded(env->dst_rq->rd, sg_status & SG_OVERLOADED);
>
> /* Update over-utilization (tipping point, U >= 0) indicator */
> set_rd_overutilized_status(env->dst_rq->rd,
> sg_status & SG_OVERUTILIZED);
>
> Note how the bits that got mixed together in sg_status now have to be
> masked out individually.
>
> The sg_status bitmask appears to make no sense at all to me.
>
> By turning these into individual bool flags we could also do away with
> all the extra SG_OVERLOADED/SG_OVERUTILIZED abstraction.
>
> Ie. something like the patch below? Untested.
Looks good. I see it is merged to sched/core.
Did a boot with that patch and hackbench is showing same results 320 CPU system.
>
> Thanks,
>
> Ingo
>
> =================>
> From: Ingo Molnar <mingo@kernel.org>
> Date: Thu, 28 Mar 2024 12:00:14 +0100
> Subject: [PATCH] sched/balancing: Simplify the sg_status bitmask and use separate ->overloaded and ->overutilized flags
>
> SG_OVERLOADED and SG_OVERUTILIZED flags plus the sg_status bitmask are an
> unnecessary complication that only make the code harder to read and slower.
>
> We only ever set them separately:
>
> thule:~/tip> git grep SG_OVER kernel/sched/
> kernel/sched/fair.c: set_rd_overutilized_status(rq->rd, SG_OVERUTILIZED);
> kernel/sched/fair.c: *sg_status |= SG_OVERLOADED;
> kernel/sched/fair.c: *sg_status |= SG_OVERUTILIZED;
> kernel/sched/fair.c: *sg_status |= SG_OVERLOADED;
> kernel/sched/fair.c: set_rd_overloaded(env->dst_rq->rd, sg_status & SG_OVERLOADED);
> kernel/sched/fair.c: sg_status & SG_OVERUTILIZED);
> kernel/sched/fair.c: } else if (sg_status & SG_OVERUTILIZED) {
> kernel/sched/fair.c: set_rd_overutilized_status(env->dst_rq->rd, SG_OVERUTILIZED);
> kernel/sched/sched.h:#define SG_OVERLOADED 0x1 /* More than one runnable task on a CPU. */
> kernel/sched/sched.h:#define SG_OVERUTILIZED 0x2 /* One or more CPUs are over-utilized. */
> kernel/sched/sched.h: set_rd_overloaded(rq->rd, SG_OVERLOADED);
>
> And use them separately, which results in suboptimal code:
>
> /* update overload indicator if we are at root domain */
> set_rd_overloaded(env->dst_rq->rd, sg_status & SG_OVERLOADED);
>
> /* Update over-utilization (tipping point, U >= 0) indicator */
> set_rd_overutilized_status(env->dst_rq->rd,
>
> Introduce separate sg_overloaded and sg_overutilized flags in update_sd_lb_stats()
> and its lower level functions, and change all of them to 'bool'.
>
> Signed-off-by: Ingo Molnar <mingo@kernel.org>
> ---
> kernel/sched/fair.c | 33 ++++++++++++++++-----------------
> kernel/sched/sched.h | 17 ++++++-----------
> 2 files changed, 22 insertions(+), 28 deletions(-)
>
> diff --git a/kernel/sched/fair.c b/kernel/sched/fair.c
> index f29efd5f19f6..ebc8d5f855de 100644
> --- a/kernel/sched/fair.c
> +++ b/kernel/sched/fair.c
> @@ -6688,19 +6688,18 @@ static inline bool cpu_overutilized(int cpu)
> /*
> * overutilized value make sense only if EAS is enabled
> */
> -static inline int is_rd_overutilized(struct root_domain *rd)
> +static inline bool is_rd_overutilized(struct root_domain *rd)
> {
> return !sched_energy_enabled() || READ_ONCE(rd->overutilized);
> }
>
> -static inline void set_rd_overutilized(struct root_domain *rd,
> - unsigned int status)
> +static inline void set_rd_overutilized(struct root_domain *rd, bool flag)
> {
> if (!sched_energy_enabled())
> return;
>
> - WRITE_ONCE(rd->overutilized, status);
> - trace_sched_overutilized_tp(rd, !!status);
> + WRITE_ONCE(rd->overutilized, flag);
> + trace_sched_overutilized_tp(rd, flag);
> }
>
> static inline void check_update_overutilized_status(struct rq *rq)
> @@ -6711,7 +6710,7 @@ static inline void check_update_overutilized_status(struct rq *rq)
> */
>
> if (!is_rd_overutilized(rq->rd) && cpu_overutilized(rq->cpu))
> - set_rd_overutilized(rq->rd, SG_OVERUTILIZED);
> + set_rd_overutilized(rq->rd, 1);
> }
> #else
> static inline void check_update_overutilized_status(struct rq *rq) { }
> @@ -9940,7 +9939,8 @@ static inline void update_sg_lb_stats(struct lb_env *env,
> struct sd_lb_stats *sds,
> struct sched_group *group,
> struct sg_lb_stats *sgs,
> - int *sg_status)
> + bool *sg_overloaded,
> + bool *sg_overutilized)
> {
> int i, nr_running, local_group;
>
> @@ -9961,10 +9961,10 @@ static inline void update_sg_lb_stats(struct lb_env *env,
> sgs->sum_nr_running += nr_running;
>
> if (nr_running > 1)
> - *sg_status |= SG_OVERLOADED;
> + *sg_overloaded = 1;
>
> if (cpu_overutilized(i))
> - *sg_status |= SG_OVERUTILIZED;
> + *sg_overutilized = 1;
>
> #ifdef CONFIG_NUMA_BALANCING
> sgs->nr_numa_running += rq->nr_numa_running;
> @@ -9986,7 +9986,7 @@ static inline void update_sg_lb_stats(struct lb_env *env,
> /* Check for a misfit task on the cpu */
> if (sgs->group_misfit_task_load < rq->misfit_task_load) {
> sgs->group_misfit_task_load = rq->misfit_task_load;
> - *sg_status |= SG_OVERLOADED;
> + *sg_overloaded = 1;
> }
> } else if (env->idle && sched_reduced_capacity(rq, env->sd)) {
> /* Check for a task running on a CPU with reduced capacity */
> @@ -10612,7 +10612,7 @@ static inline void update_sd_lb_stats(struct lb_env *env, struct sd_lb_stats *sd
> struct sg_lb_stats *local = &sds->local_stat;
> struct sg_lb_stats tmp_sgs;
> unsigned long sum_util = 0;
> - int sg_status = 0;
> + bool sg_overloaded = 0, sg_overutilized = 0;
>
> do {
> struct sg_lb_stats *sgs = &tmp_sgs;
> @@ -10628,7 +10628,7 @@ static inline void update_sd_lb_stats(struct lb_env *env, struct sd_lb_stats *sd
> update_group_capacity(env->sd, env->dst_cpu);
> }
>
> - update_sg_lb_stats(env, sds, sg, sgs, &sg_status);
> + update_sg_lb_stats(env, sds, sg, sgs, &sg_overloaded, &sg_overutilized);
>
> if (!local_group && update_sd_pick_busiest(env, sds, sg, sgs)) {
> sds->busiest = sg;
> @@ -10657,13 +10657,12 @@ static inline void update_sd_lb_stats(struct lb_env *env, struct sd_lb_stats *sd
>
> if (!env->sd->parent) {
> /* update overload indicator if we are at root domain */
> - set_rd_overloaded(env->dst_rq->rd, sg_status & SG_OVERLOADED);
> + set_rd_overloaded(env->dst_rq->rd, sg_overloaded);
>
> /* Update over-utilization (tipping point, U >= 0) indicator */
> - set_rd_overutilized(env->dst_rq->rd,
> - sg_status & SG_OVERUTILIZED);
> - } else if (sg_status & SG_OVERUTILIZED) {
> - set_rd_overutilized(env->dst_rq->rd, SG_OVERUTILIZED);
> + set_rd_overutilized(env->dst_rq->rd, sg_overloaded);
> + } else if (sg_overutilized) {
> + set_rd_overutilized(env->dst_rq->rd, sg_overutilized);
> }
>
> update_idle_cpu_scan(env, sum_util);
> diff --git a/kernel/sched/sched.h b/kernel/sched/sched.h
> index 07c6669b8250..7c39dbf31f75 100644
> --- a/kernel/sched/sched.h
> +++ b/kernel/sched/sched.h
> @@ -713,7 +713,7 @@ struct rt_rq {
> } highest_prio;
> #endif
> #ifdef CONFIG_SMP
> - int overloaded;
> + bool overloaded;
> struct plist_head pushable_tasks;
>
> #endif /* CONFIG_SMP */
> @@ -757,7 +757,7 @@ struct dl_rq {
> u64 next;
> } earliest_dl;
>
> - int overloaded;
> + bool overloaded;
>
> /*
> * Tasks on this rq that can be pushed away. They are kept in
> @@ -850,10 +850,6 @@ struct perf_domain {
> struct rcu_head rcu;
> };
>
> -/* Scheduling group status flags */
> -#define SG_OVERLOADED 0x1 /* More than one runnable task on a CPU. */
> -#define SG_OVERUTILIZED 0x2 /* One or more CPUs are over-utilized. */
> -
> /*
> * We add the notion of a root-domain which will be used to define per-domain
> * variables. Each exclusive cpuset essentially defines an island domain by
> @@ -874,10 +870,10 @@ struct root_domain {
> * - More than one runnable task
> * - Running task is misfit
> */
> - int overloaded;
> + bool overloaded;
>
> /* Indicate one or more cpus over-utilized (tipping point) */
> - int overutilized;
> + bool overutilized;
>
> /*
> * The bit corresponding to a CPU gets set here if such CPU has more
> @@ -2540,9 +2536,8 @@ static inline void add_nr_running(struct rq *rq, unsigned count)
> }
>
> #ifdef CONFIG_SMP
> - if (prev_nr < 2 && rq->nr_running >= 2) {
> - set_rd_overloaded(rq->rd, SG_OVERLOADED);
> - }
> + if (prev_nr < 2 && rq->nr_running >= 2)
> + set_rd_overloaded(rq->rd, 1);
> #endif
>
> sched_update_tick_dependency(rq);
^ permalink raw reply [flat|nested] 18+ messages in thread* Re: [PATCH v3 0/2] sched: Minor changes for rd->overload access
2024-03-28 17:19 ` Shrikanth Hegde
@ 2024-03-29 6:55 ` Ingo Molnar
0 siblings, 0 replies; 18+ messages in thread
From: Ingo Molnar @ 2024-03-29 6:55 UTC (permalink / raw)
To: Shrikanth Hegde
Cc: peterz, vincent.guittot, dietmar.eggemann, qyousef, linux-kernel,
vschneid
* Shrikanth Hegde <sshegde@linux.ibm.com> wrote:
>
>
> On 3/28/24 4:37 PM, Ingo Molnar wrote:
> >
> > * Ingo Molnar <mingo@kernel.org> wrote:
> >
> >> Plus I've applied a patch to rename ::overload to ::overloaded. It is
> >> silly to use an ambiguous noun instead of a clear adjective when naming
> >> such a flag ...
> >
> > Plus SG_OVERLOAD should be SG_OVERLOADED as well - it now looks in line
> > with SG_OVERUTILIZED:
> >
> > /* Scheduling group status flags */
> > #define SG_OVERLOADED 0x1 /* More than one runnable task on a CPU. */
> > #define SG_OVERUTILIZED 0x2 /* One or more CPUs are over-utilized. */
> >
> > My followup question is: why are these a bitmask, why not separate
> > flags?
> >
> > AFAICS we only ever set them separately:
> >
> > thule:~/tip> git grep SG_OVER kernel/sched/
> > kernel/sched/fair.c: set_rd_overutilized_status(rq->rd, SG_OVERUTILIZED);
> > kernel/sched/fair.c: *sg_status |= SG_OVERLOADED;
> > kernel/sched/fair.c: *sg_status |= SG_OVERUTILIZED;
> > kernel/sched/fair.c: *sg_status |= SG_OVERLOADED;
> > kernel/sched/fair.c: set_rd_overloaded(env->dst_rq->rd, sg_status & SG_OVERLOADED);
> > kernel/sched/fair.c: sg_status & SG_OVERUTILIZED);
> > kernel/sched/fair.c: } else if (sg_status & SG_OVERUTILIZED) {
> > kernel/sched/fair.c: set_rd_overutilized_status(env->dst_rq->rd, SG_OVERUTILIZED);
> > kernel/sched/sched.h:#define SG_OVERLOADED 0x1 /* More than one runnable task on a CPU. */
> > kernel/sched/sched.h:#define SG_OVERUTILIZED 0x2 /* One or more CPUs are over-utilized. */
> > kernel/sched/sched.h: set_rd_overloaded(rq->rd, SG_OVERLOADED);
> >
> > In fact this results in suboptimal code:
> >
> > /* update overload indicator if we are at root domain */
> > set_rd_overloaded(env->dst_rq->rd, sg_status & SG_OVERLOADED);
> >
> > /* Update over-utilization (tipping point, U >= 0) indicator */
> > set_rd_overutilized_status(env->dst_rq->rd,
> > sg_status & SG_OVERUTILIZED);
> >
> > Note how the bits that got mixed together in sg_status now have to be
> > masked out individually.
> >
> > The sg_status bitmask appears to make no sense at all to me.
> >
> > By turning these into individual bool flags we could also do away with
> > all the extra SG_OVERLOADED/SG_OVERUTILIZED abstraction.
> >
> > Ie. something like the patch below? Untested.
>
> Looks good. I see it is merged to sched/core.
> Did a boot with that patch and hackbench is showing same results 320 CPU system.
Thanks, I've added:
Acked-by: Shrikanth Hegde <sshegde@linux.ibm.com>
Tested-by: Shrikanth Hegde <sshegde@linux.ibm.com>
And applied the additional docbook fix below on top as well.
Thaks,
Ingo
=================>
kernel/sched/fair.c | 3 ++-
1 file changed, 2 insertions(+), 1 deletion(-)
diff --git a/kernel/sched/fair.c b/kernel/sched/fair.c
index ebc8d5f855de..1dd37168da50 100644
--- a/kernel/sched/fair.c
+++ b/kernel/sched/fair.c
@@ -9933,7 +9933,8 @@ sched_reduced_capacity(struct rq *rq, struct sched_domain *sd)
* @sds: Load-balancing data with statistics of the local group.
* @group: sched_group whose statistics are to be updated.
* @sgs: variable to hold the statistics for this group.
- * @sg_status: Holds flag indicating the status of the sched_group
+ * @sg_overloaded: sched_group is overloaded
+ * @sg_overutilized: sched_group is overutilized
*/
static inline void update_sg_lb_stats(struct lb_env *env,
struct sd_lb_stats *sds,
^ permalink raw reply related [flat|nested] 18+ messages in thread
* [tip: sched/core] sched/fair: Rename set_rd_overutilized_status() to set_rd_overutilized()
2024-03-28 10:34 ` Ingo Molnar
` (3 preceding siblings ...)
2024-03-28 11:07 ` [PATCH v3 0/2] sched: Minor changes for rd->overload access Ingo Molnar
@ 2024-03-28 12:01 ` tip-bot2 for Ingo Molnar
2024-03-28 12:58 ` [PATCH v3 0/2] sched: Minor changes for rd->overload access Shrikanth Hegde
5 siblings, 0 replies; 18+ messages in thread
From: tip-bot2 for Ingo Molnar @ 2024-03-28 12:01 UTC (permalink / raw)
To: linux-tip-commits
Cc: Ingo Molnar, Qais Yousef, Shrikanth Hegde, Vincent Guittot,
Peter Zijlstra, x86, linux-kernel
The following commit has been merged into the sched/core branch of tip:
Commit-ID: 4d0a63e5b841c759c9a306aff158420421ef016f
Gitweb: https://git.kernel.org/tip/4d0a63e5b841c759c9a306aff158420421ef016f
Author: Ingo Molnar <mingo@kernel.org>
AuthorDate: Thu, 28 Mar 2024 11:54:42 +01:00
Committer: Ingo Molnar <mingo@kernel.org>
CommitterDate: Thu, 28 Mar 2024 11:54:42 +01:00
sched/fair: Rename set_rd_overutilized_status() to set_rd_overutilized()
The _status() postfix has no real meaning, simplify the naming
and harmonize it with set_rd_overloaded().
Signed-off-by: Ingo Molnar <mingo@kernel.org>
Cc: Qais Yousef <qyousef@layalina.io>
Cc: Shrikanth Hegde <sshegde@linux.ibm.com>
Cc: Vincent Guittot <vincent.guittot@linaro.org>
Cc: Peter Zijlstra <peterz@infradead.org>
Link: https://lore.kernel.org/r/ZgVHq65XKsOZpfgK@gmail.com
---
kernel/sched/fair.c | 8 ++++----
1 file changed, 4 insertions(+), 4 deletions(-)
diff --git a/kernel/sched/fair.c b/kernel/sched/fair.c
index 839a97a..f29efd5 100644
--- a/kernel/sched/fair.c
+++ b/kernel/sched/fair.c
@@ -6693,7 +6693,7 @@ static inline int is_rd_overutilized(struct root_domain *rd)
return !sched_energy_enabled() || READ_ONCE(rd->overutilized);
}
-static inline void set_rd_overutilized_status(struct root_domain *rd,
+static inline void set_rd_overutilized(struct root_domain *rd,
unsigned int status)
{
if (!sched_energy_enabled())
@@ -6711,7 +6711,7 @@ static inline void check_update_overutilized_status(struct rq *rq)
*/
if (!is_rd_overutilized(rq->rd) && cpu_overutilized(rq->cpu))
- set_rd_overutilized_status(rq->rd, SG_OVERUTILIZED);
+ set_rd_overutilized(rq->rd, SG_OVERUTILIZED);
}
#else
static inline void check_update_overutilized_status(struct rq *rq) { }
@@ -10660,10 +10660,10 @@ static inline void update_sd_lb_stats(struct lb_env *env, struct sd_lb_stats *sd
set_rd_overloaded(env->dst_rq->rd, sg_status & SG_OVERLOADED);
/* Update over-utilization (tipping point, U >= 0) indicator */
- set_rd_overutilized_status(env->dst_rq->rd,
+ set_rd_overutilized(env->dst_rq->rd,
sg_status & SG_OVERUTILIZED);
} else if (sg_status & SG_OVERUTILIZED) {
- set_rd_overutilized_status(env->dst_rq->rd, SG_OVERUTILIZED);
+ set_rd_overutilized(env->dst_rq->rd, SG_OVERUTILIZED);
}
update_idle_cpu_scan(env, sum_util);
^ permalink raw reply related [flat|nested] 18+ messages in thread* Re: [PATCH v3 0/2] sched: Minor changes for rd->overload access
2024-03-28 10:34 ` Ingo Molnar
` (4 preceding siblings ...)
2024-03-28 12:01 ` [tip: sched/core] sched/fair: Rename set_rd_overutilized_status() to set_rd_overutilized() tip-bot2 for Ingo Molnar
@ 2024-03-28 12:58 ` Shrikanth Hegde
5 siblings, 0 replies; 18+ messages in thread
From: Shrikanth Hegde @ 2024-03-28 12:58 UTC (permalink / raw)
To: Ingo Molnar
Cc: peterz, vincent.guittot, dietmar.eggemann, qyousef, linux-kernel,
vschneid
On 3/28/24 4:04 PM, Ingo Molnar wrote:
>
> * Shrikanth Hegde <sshegde@linux.ibm.com> wrote:
>
>>
>> Hi Ingo.
>>
>> These two patches apply cleanly now to sched/core.
>>
>> 7a9dd7ef946c (HEAD -> sched/core) sched/fair: Use helper functions to access rd->overload
>> 4f24aa918558 sched/fair: Check rd->overload value before update
>> c829d6818b60 (origin/sched/core) sched/fair: Simplify the continue_balancing logic in sched_balance_newidle()
>> d0f5d3cefc25 sched/fair: Introduce is_rd_overutilized() helper function to access root_domain::overutilized
>
> I've applied them, but note that there were quite a few avoidable typos
> and grammar mistakes in the changelogs. Please always review what
> you've submitted versus what I have applied and try to learn from that:
> I almost invariable have to edit some detail to make the changelog more
> presentable... Could you please take more care with future patches?
>
Noted.
I will learn for it, thank you.
> I also renamed the accessor functions in the second patch to:
>
> get_rd_overload()
> set_rd_overload()
>
> Plus I've applied a patch to rename ::overload to ::overloaded. It is
> silly to use an ambiguous noun instead of a clear adjective when naming
> such a flag ...
>
sure. looks fine.
> Thanks,
>
> Ingo
^ permalink raw reply [flat|nested] 18+ messages in thread