From: riel@redhat.com
To: linux-kernel@vger.kernel.org
Cc: Rik van Riel <riel@redhat.com>,
Peter Zijlstra <peterz@infradead.org>,
Clark Williams <williams@redhat.com>,
Li Zefan <lizefan@huawei.com>, Ingo Molnar <mingo@redhat.com>,
Luiz Capitulino <lcapitulino@redhat.com>,
Mike Galbraith <umgwanakikbuti@gmail.com>,
cgroups@vger.kernel.org
Subject: [PATCH 1/2] cpusets,isolcpus: exclude isolcpus from load balancing in cpusets
Date: Wed, 25 Feb 2015 11:38:07 -0500 [thread overview]
Message-ID: <1424882288-2910-2-git-send-email-riel@redhat.com> (raw)
In-Reply-To: <1424882288-2910-1-git-send-email-riel@redhat.com>
From: Rik van Riel <riel@redhat.com>
Ensure that cpus specified with the isolcpus= boot commandline
option stay outside of the load balancing in the kernel scheduler.
Operations like load balancing can introduce unwanted latencies,
which is exactly what the isolcpus= commandline is there to prevent.
Previously, simply creating a new cpuset, without even touching the
cpuset.cpus field inside the new cpuset, would undo the effects of
isolcpus=, by creating a scheduler domain spanning the whole system,
and setting up load balancing inside that domain. The cpuset root
cpuset.cpus file is read-only, so there was not even a way to undo
that effect.
This does not impact the majority of cpusets users, since isolcpus=
is a fairly specialized feature used for realtime purposes.
Cc: Peter Zijlstra <peterz@infradead.org>
Cc: Clark Williams <williams@redhat.com>
Cc: Li Zefan <lizefan@huawei.com>
Cc: Ingo Molnar <mingo@redhat.com>
Cc: Luiz Capitulino <lcapitulino@redhat.com>
Cc: Mike Galbraith <umgwanakikbuti@gmail.com>
Cc: cgroups@vger.kernel.org
Signed-off-by: Rik van Riel <riel@redhat.com>
Tested-by: David Rientjes <rientjes@google.com>
---
include/linux/sched.h | 2 ++
kernel/cpuset.c | 13 +++++++++++--
kernel/sched/core.c | 2 +-
3 files changed, 14 insertions(+), 3 deletions(-)
diff --git a/include/linux/sched.h b/include/linux/sched.h
index 6d77432e14ff..aeae02435717 100644
--- a/include/linux/sched.h
+++ b/include/linux/sched.h
@@ -1038,6 +1038,8 @@ static inline struct cpumask *sched_domain_span(struct sched_domain *sd)
extern void partition_sched_domains(int ndoms_new, cpumask_var_t doms_new[],
struct sched_domain_attr *dattr_new);
+extern cpumask_var_t cpu_isolated_map;
+
/* Allocate an array of sched domains, for partition_sched_domains(). */
cpumask_var_t *alloc_sched_domains(unsigned int ndoms);
void free_sched_domains(cpumask_var_t doms[], unsigned int ndoms);
diff --git a/kernel/cpuset.c b/kernel/cpuset.c
index 1d1fe9361d29..b544e5229d99 100644
--- a/kernel/cpuset.c
+++ b/kernel/cpuset.c
@@ -625,6 +625,7 @@ static int generate_sched_domains(cpumask_var_t **domains,
int csn; /* how many cpuset ptrs in csa so far */
int i, j, k; /* indices for partition finding loops */
cpumask_var_t *doms; /* resulting partition; i.e. sched domains */
+ cpumask_var_t non_isolated_cpus; /* load balanced CPUs */
struct sched_domain_attr *dattr; /* attributes for custom domains */
int ndoms = 0; /* number of sched domains in result */
int nslot; /* next empty doms[] struct cpumask slot */
@@ -634,6 +635,10 @@ static int generate_sched_domains(cpumask_var_t **domains,
dattr = NULL;
csa = NULL;
+ if (!alloc_cpumask_var(&non_isolated_cpus, GFP_KERNEL))
+ goto done;
+ cpumask_andnot(non_isolated_cpus, cpu_possible_mask, cpu_isolated_map);
+
/* Special case for the 99% of systems with one, full, sched domain */
if (is_sched_load_balance(&top_cpuset)) {
ndoms = 1;
@@ -646,7 +651,8 @@ static int generate_sched_domains(cpumask_var_t **domains,
*dattr = SD_ATTR_INIT;
update_domain_attr_tree(dattr, &top_cpuset);
}
- cpumask_copy(doms[0], top_cpuset.effective_cpus);
+ cpumask_and(doms[0], top_cpuset.effective_cpus,
+ non_isolated_cpus);
goto done;
}
@@ -669,7 +675,8 @@ static int generate_sched_domains(cpumask_var_t **domains,
* the corresponding sched domain.
*/
if (!cpumask_empty(cp->cpus_allowed) &&
- !is_sched_load_balance(cp))
+ !(is_sched_load_balance(cp) &&
+ cpumask_intersects(cp->cpus_allowed, non_isolated_cpus)))
continue;
if (is_sched_load_balance(cp))
@@ -751,6 +758,7 @@ static int generate_sched_domains(cpumask_var_t **domains,
if (apn == b->pn) {
cpumask_or(dp, dp, b->effective_cpus);
+ cpumask_and(dp, dp, non_isolated_cpus);
if (dattr)
update_domain_attr_tree(dattr + nslot, b);
@@ -763,6 +771,7 @@ static int generate_sched_domains(cpumask_var_t **domains,
BUG_ON(nslot != ndoms);
done:
+ free_cpumask_var(non_isolated_cpus);
kfree(csa);
/*
diff --git a/kernel/sched/core.c b/kernel/sched/core.c
index f0f831e8a345..3db1beace19b 100644
--- a/kernel/sched/core.c
+++ b/kernel/sched/core.c
@@ -5812,7 +5812,7 @@ cpu_attach_domain(struct sched_domain *sd, struct root_domain *rd, int cpu)
}
/* cpus with isolated domains */
-static cpumask_var_t cpu_isolated_map;
+cpumask_var_t cpu_isolated_map;
/* Setup the mask of cpus configured for isolated domains */
static int __init isolated_cpu_setup(char *str)
--
2.1.0
next prev parent reply other threads:[~2015-02-25 16:38 UTC|newest]
Thread overview: 48+ messages / expand[flat|nested] mbox.gz Atom feed top
2015-02-25 16:38 [PATCH -v2 0/2] cpusets,isolcpus: resolve conflict between cpusets and isolcpus riel
2015-02-25 16:38 ` riel [this message]
[not found] ` <1424882288-2910-2-git-send-email-riel-H+wXaHxf7aLQT0dZR+AlfA@public.gmane.org>
2015-02-27 9:32 ` [PATCH 1/2] cpusets,isolcpus: exclude isolcpus from load balancing in cpusets Peter Zijlstra
2015-02-27 9:32 ` Peter Zijlstra
[not found] ` <20150227093231.GG21418-ndre7Fmf5hadTX5a5knrm8zTDFooKrT+cvkQGrU6aU0@public.gmane.org>
2015-02-27 17:08 ` [PATCH 3/2] cpusets,isolcpus: document relationship between cpusets & isolcpus Rik van Riel
2015-02-27 17:08 ` Rik van Riel
2015-02-27 21:15 ` David Rientjes
[not found] ` <20150227120803.07db15fe-XDFsmL65zczMw9PXcw3sFBL4W9x8LtSr@public.gmane.org>
2015-02-28 3:23 ` Zefan Li
2015-02-28 3:23 ` Zefan Li
2015-02-28 3:21 ` [PATCH 1/2] cpusets,isolcpus: exclude isolcpus from load balancing in cpusets Zefan Li
2015-02-28 3:21 ` Zefan Li
2015-02-25 16:38 ` [PATCH 2/2] cpusets,isolcpus: add file to show isolated cpus in cpuset riel
[not found] ` <1424882288-2910-3-git-send-email-riel-H+wXaHxf7aLQT0dZR+AlfA@public.gmane.org>
2015-02-25 21:09 ` David Rientjes
2015-02-25 21:09 ` David Rientjes
2015-02-25 21:21 ` Rik van Riel
2015-02-25 21:32 ` [PATCH v3 " Rik van Riel
2015-02-25 21:32 ` Rik van Riel
2015-02-26 11:05 ` [PATCH " Zefan Li
2015-02-26 11:05 ` Zefan Li
2015-02-26 15:24 ` Rik van Riel
2015-02-26 17:12 ` [PATCH v4 " Rik van Riel
2015-02-26 17:12 ` Rik van Riel
[not found] ` <20150226121231.6fcba7e8-XDFsmL65zczMw9PXcw3sFBL4W9x8LtSr@public.gmane.org>
2015-02-28 3:22 ` Zefan Li
2015-02-28 3:22 ` Zefan Li
2015-03-02 6:15 ` Zefan Li
2015-03-02 6:15 ` Zefan Li
2015-03-02 9:12 ` Peter Zijlstra
2015-03-03 9:51 ` Zefan Li
2015-03-03 9:51 ` Zefan Li
2015-03-02 9:09 ` Peter Zijlstra
2015-03-02 9:09 ` Peter Zijlstra
2015-03-02 12:44 ` Mike Galbraith
[not found] ` <1425300290.5863.17.camel-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org>
2015-03-02 14:35 ` Rik van Riel
2015-03-02 14:35 ` Rik van Riel
[not found] ` <54F47534.7070204-H+wXaHxf7aLQT0dZR+AlfA@public.gmane.org>
2015-03-02 14:54 ` Mike Galbraith
2015-03-02 14:54 ` Mike Galbraith
2015-03-02 15:29 ` Tejun Heo
2015-03-02 15:29 ` Tejun Heo
2015-03-02 16:02 ` Mike Galbraith
[not found] ` <1425312177.12094.15.camel-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org>
2015-03-02 16:09 ` Tejun Heo
2015-03-02 16:09 ` Tejun Heo
[not found] ` <20150302160903.GE17694-piEFEHQLUPpN0TnZuCh8vA@public.gmane.org>
2015-03-02 17:35 ` Mike Galbraith
2015-03-02 17:35 ` Mike Galbraith
2015-03-02 17:01 ` Tejun Heo
[not found] ` <20150302170116.GJ17694-piEFEHQLUPpN0TnZuCh8vA@public.gmane.org>
2015-03-02 17:31 ` Tejun Heo
2015-03-02 17:31 ` Tejun Heo
-- strict thread matches above, loose matches on Subject: below --
2015-02-23 21:45 [PATCH 0/2] cpusets,isolcpus: resolve conflict between cpusets and isolcpus riel
2015-02-23 21:45 ` [PATCH 1/2] cpusets,isolcpus: exclude isolcpus from load balancing in cpusets riel
2015-02-25 2:10 ` David Rientjes
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=1424882288-2910-2-git-send-email-riel@redhat.com \
--to=riel@redhat.com \
--cc=cgroups@vger.kernel.org \
--cc=lcapitulino@redhat.com \
--cc=linux-kernel@vger.kernel.org \
--cc=lizefan@huawei.com \
--cc=mingo@redhat.com \
--cc=peterz@infradead.org \
--cc=umgwanakikbuti@gmail.com \
--cc=williams@redhat.com \
/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.