From: Mel Gorman <mgorman@techsingularity.net>
To: LKML <linux-kernel@vger.kernel.org>
Cc: Barry Song <song.bao.hua@hisilicon.com>,
Juri Lelli <juri.lelli@redhat.com>,
Vincent Guittot <vincent.guittot@linaro.org>,
Peter Ziljstra <peterz@infradead.org>,
Aubrey Li <aubrey.li@linux.intel.com>,
Ingo Molnar <mingo@redhat.com>,
Mel Gorman <mgorman@techsingularity.net>,
Valentin Schneider <valentin.schneider@arm.com>,
Linux-ARM <linux-arm-kernel@lists.infradead.org>
Subject: [PATCH 09/10] sched/fair: Limit the search for an idle core
Date: Thu, 3 Dec 2020 14:11:23 +0000 [thread overview]
Message-ID: <20201203141124.7391-10-mgorman@techsingularity.net> (raw)
In-Reply-To: <20201203141124.7391-1-mgorman@techsingularity.net>
Note: This is a bad idea, it's for illustration only to show how the
search space can be filtered at each stage. Searching an
idle_cpu_mask would be a potential option. select_idle_core()
would be left alone as it has its own throttling mechanism
select_idle_core() may search a full domain for an idle core even if idle
CPUs exist result in an excessive search. This patch partially limits
the search for an idle core similar to select_idle_cpu() once an idle
candidate is found.
Note that this patch can *increase* the number of runqueues considered.
Any searching done by select_idle_core() is duplicated by select_idle_cpu()
if an idle candidate is not found. If there is an idle CPU then aborting
select_idle_core() can have a negative impact. This is addressed in the
next patch.
Signed-off-by: Mel Gorman <mgorman@techsingularity.net>
---
kernel/sched/fair.c | 16 +++++++++++++---
1 file changed, 13 insertions(+), 3 deletions(-)
diff --git a/kernel/sched/fair.c b/kernel/sched/fair.c
index 33ce65b67381..cd95daf9f53e 100644
--- a/kernel/sched/fair.c
+++ b/kernel/sched/fair.c
@@ -6095,7 +6095,8 @@ void __update_idle_core(struct rq *rq)
* there are no idle cores left in the system; tracked through
* sd_llc->shared->has_idle_cores and enabled through update_idle_core() above.
*/
-static int select_idle_core(struct task_struct *p, struct sched_domain *sd, int target)
+static int select_idle_core(struct task_struct *p, struct sched_domain *sd,
+ int target, int nr)
{
int idle_candidate = -1;
struct cpumask *cpus = this_cpu_cpumask_var_ptr(select_idle_mask);
@@ -6115,6 +6116,11 @@ static int select_idle_core(struct task_struct *p, struct sched_domain *sd, int
for_each_cpu(cpu, cpu_smt_mask(core)) {
schedstat_inc(this_rq()->sis_scanned);
+
+ /* Apply limits if there is an idle candidate */
+ if (idle_candidate != -1)
+ nr--;
+
if (!available_idle_cpu(cpu)) {
idle = false;
if (idle_candidate != -1)
@@ -6130,6 +6136,9 @@ static int select_idle_core(struct task_struct *p, struct sched_domain *sd, int
if (idle)
return core;
+ if (!nr)
+ break;
+
cpumask_andnot(cpus, cpus, cpu_smt_mask(core));
}
@@ -6165,7 +6174,8 @@ static int select_idle_smt(struct task_struct *p, struct sched_domain *sd, int t
#else /* CONFIG_SCHED_SMT */
-static inline int select_idle_core(struct task_struct *p, struct sched_domain *sd, int target)
+static inline int select_idle_core(struct task_struct *p, struct sched_domain *sd,
+ int target, int nr)
{
return -1;
}
@@ -6349,7 +6359,7 @@ static int select_idle_sibling(struct task_struct *p, int prev, int target)
depth = sis_search_depth(sd, this_sd);
schedstat_inc(this_rq()->sis_domain_search);
- i = select_idle_core(p, sd, target);
+ i = select_idle_core(p, sd, target, depth);
if ((unsigned)i < nr_cpumask_bits)
return i;
--
2.26.2
_______________________________________________
linux-arm-kernel mailing list
linux-arm-kernel@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/linux-arm-kernel
WARNING: multiple messages have this Message-ID (diff)
From: Mel Gorman <mgorman@techsingularity.net>
To: LKML <linux-kernel@vger.kernel.org>
Cc: Aubrey Li <aubrey.li@linux.intel.com>,
Barry Song <song.bao.hua@hisilicon.com>,
Ingo Molnar <mingo@redhat.com>,
Peter Ziljstra <peterz@infradead.org>,
Juri Lelli <juri.lelli@redhat.com>,
Vincent Guittot <vincent.guittot@linaro.org>,
Valentin Schneider <valentin.schneider@arm.com>,
Linux-ARM <linux-arm-kernel@lists.infradead.org>,
Mel Gorman <mgorman@techsingularity.net>
Subject: [PATCH 09/10] sched/fair: Limit the search for an idle core
Date: Thu, 3 Dec 2020 14:11:23 +0000 [thread overview]
Message-ID: <20201203141124.7391-10-mgorman@techsingularity.net> (raw)
In-Reply-To: <20201203141124.7391-1-mgorman@techsingularity.net>
Note: This is a bad idea, it's for illustration only to show how the
search space can be filtered at each stage. Searching an
idle_cpu_mask would be a potential option. select_idle_core()
would be left alone as it has its own throttling mechanism
select_idle_core() may search a full domain for an idle core even if idle
CPUs exist result in an excessive search. This patch partially limits
the search for an idle core similar to select_idle_cpu() once an idle
candidate is found.
Note that this patch can *increase* the number of runqueues considered.
Any searching done by select_idle_core() is duplicated by select_idle_cpu()
if an idle candidate is not found. If there is an idle CPU then aborting
select_idle_core() can have a negative impact. This is addressed in the
next patch.
Signed-off-by: Mel Gorman <mgorman@techsingularity.net>
---
kernel/sched/fair.c | 16 +++++++++++++---
1 file changed, 13 insertions(+), 3 deletions(-)
diff --git a/kernel/sched/fair.c b/kernel/sched/fair.c
index 33ce65b67381..cd95daf9f53e 100644
--- a/kernel/sched/fair.c
+++ b/kernel/sched/fair.c
@@ -6095,7 +6095,8 @@ void __update_idle_core(struct rq *rq)
* there are no idle cores left in the system; tracked through
* sd_llc->shared->has_idle_cores and enabled through update_idle_core() above.
*/
-static int select_idle_core(struct task_struct *p, struct sched_domain *sd, int target)
+static int select_idle_core(struct task_struct *p, struct sched_domain *sd,
+ int target, int nr)
{
int idle_candidate = -1;
struct cpumask *cpus = this_cpu_cpumask_var_ptr(select_idle_mask);
@@ -6115,6 +6116,11 @@ static int select_idle_core(struct task_struct *p, struct sched_domain *sd, int
for_each_cpu(cpu, cpu_smt_mask(core)) {
schedstat_inc(this_rq()->sis_scanned);
+
+ /* Apply limits if there is an idle candidate */
+ if (idle_candidate != -1)
+ nr--;
+
if (!available_idle_cpu(cpu)) {
idle = false;
if (idle_candidate != -1)
@@ -6130,6 +6136,9 @@ static int select_idle_core(struct task_struct *p, struct sched_domain *sd, int
if (idle)
return core;
+ if (!nr)
+ break;
+
cpumask_andnot(cpus, cpus, cpu_smt_mask(core));
}
@@ -6165,7 +6174,8 @@ static int select_idle_smt(struct task_struct *p, struct sched_domain *sd, int t
#else /* CONFIG_SCHED_SMT */
-static inline int select_idle_core(struct task_struct *p, struct sched_domain *sd, int target)
+static inline int select_idle_core(struct task_struct *p, struct sched_domain *sd,
+ int target, int nr)
{
return -1;
}
@@ -6349,7 +6359,7 @@ static int select_idle_sibling(struct task_struct *p, int prev, int target)
depth = sis_search_depth(sd, this_sd);
schedstat_inc(this_rq()->sis_domain_search);
- i = select_idle_core(p, sd, target);
+ i = select_idle_core(p, sd, target, depth);
if ((unsigned)i < nr_cpumask_bits)
return i;
--
2.26.2
next prev parent reply other threads:[~2020-12-03 14:13 UTC|newest]
Thread overview: 60+ messages / expand[flat|nested] mbox.gz Atom feed top
2020-12-03 14:11 [RFC PATCH 00/10] Reduce time complexity of select_idle_sibling Mel Gorman
2020-12-03 14:11 ` Mel Gorman
2020-12-03 14:11 ` [PATCH 01/10] sched/fair: Track efficiency " Mel Gorman
2020-12-03 14:11 ` Mel Gorman
2020-12-03 14:11 ` [PATCH 02/10] sched/fair: Track efficiency of task recent_used_cpu Mel Gorman
2020-12-03 14:11 ` Mel Gorman
2020-12-03 14:11 ` [PATCH 03/10] sched/fair: Remove SIS_AVG_CPU Mel Gorman
2020-12-03 14:11 ` Mel Gorman
2020-12-03 14:11 ` [PATCH 04/10] sched/fair: Return an idle cpu if one is found after a failed search for an idle core Mel Gorman
2020-12-03 14:11 ` Mel Gorman
2020-12-03 16:35 ` Vincent Guittot
2020-12-03 16:35 ` Vincent Guittot
2020-12-03 17:50 ` Mel Gorman
2020-12-03 17:50 ` Mel Gorman
2020-12-03 14:11 ` [PATCH 05/10] sched/fair: Do not replace recent_used_cpu with the new target Mel Gorman
2020-12-03 14:11 ` Mel Gorman
2020-12-03 14:11 ` [PATCH 06/10] sched/fair: Clear the target CPU from the cpumask of CPUs searched Mel Gorman
2020-12-03 14:11 ` Mel Gorman
2020-12-03 16:38 ` Vincent Guittot
2020-12-03 16:38 ` Vincent Guittot
2020-12-03 17:52 ` Mel Gorman
2020-12-03 17:52 ` Mel Gorman
2020-12-04 10:56 ` Vincent Guittot
2020-12-04 10:56 ` Vincent Guittot
2020-12-04 11:30 ` Mel Gorman
2020-12-04 11:30 ` Mel Gorman
2020-12-04 13:13 ` Vincent Guittot
2020-12-04 13:13 ` Vincent Guittot
2020-12-04 13:17 ` Vincent Guittot
2020-12-04 13:17 ` Vincent Guittot
2020-12-04 13:40 ` Li, Aubrey
2020-12-04 13:40 ` Li, Aubrey
2020-12-04 13:47 ` Li, Aubrey
2020-12-04 13:47 ` Li, Aubrey
2020-12-04 13:47 ` Vincent Guittot
2020-12-04 13:47 ` Vincent Guittot
2020-12-04 14:07 ` Li, Aubrey
2020-12-04 14:07 ` Li, Aubrey
2020-12-04 14:31 ` Mel Gorman
2020-12-04 14:31 ` Mel Gorman
2020-12-04 15:23 ` Vincent Guittot
2020-12-04 15:23 ` Vincent Guittot
2020-12-04 15:40 ` Mel Gorman
2020-12-04 15:40 ` Mel Gorman
2020-12-04 15:43 ` Vincent Guittot
2020-12-04 15:43 ` Vincent Guittot
2020-12-04 18:41 ` Mel Gorman
2020-12-04 18:41 ` Mel Gorman
2020-12-04 14:27 ` Mel Gorman
2020-12-04 14:27 ` Mel Gorman
2020-12-03 14:11 ` [PATCH 07/10] sched/fair: Account for the idle cpu/smt search cost Mel Gorman
2020-12-03 14:11 ` Mel Gorman
2020-12-03 14:11 ` [PATCH 08/10] sched/fair: Reintroduce SIS_AVG_CPU but in the context of SIS_PROP to reduce search depth Mel Gorman
2020-12-03 14:11 ` Mel Gorman
2020-12-03 14:11 ` Mel Gorman [this message]
2020-12-03 14:11 ` [PATCH 09/10] sched/fair: Limit the search for an idle core Mel Gorman
2020-12-03 14:19 ` Mel Gorman
2020-12-03 14:19 ` Mel Gorman
2020-12-03 14:20 ` [PATCH 10/10] sched/fair: Avoid revisiting CPUs multiple times during select_idle_sibling Mel Gorman
2020-12-03 14:20 ` 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=20201203141124.7391-10-mgorman@techsingularity.net \
--to=mgorman@techsingularity.net \
--cc=aubrey.li@linux.intel.com \
--cc=juri.lelli@redhat.com \
--cc=linux-arm-kernel@lists.infradead.org \
--cc=linux-kernel@vger.kernel.org \
--cc=mingo@redhat.com \
--cc=peterz@infradead.org \
--cc=song.bao.hua@hisilicon.com \
--cc=valentin.schneider@arm.com \
--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.