From: Li Zefan <lizefan@huawei.com>
To: Tejun Heo <tj@kernel.org>
Cc: LKML <linux-kernel@vger.kernel.org>,
Cgroups <cgroups@vger.kernel.org>,
Containers <containers@lists.linux-foundation.org>
Subject: [PATCH 08/11] cpuset: separate configured masks and efffective masks
Date: Wed, 21 Aug 2013 18:00:42 +0800 [thread overview]
Message-ID: <52148FCA.8010704@huawei.com> (raw)
In-Reply-To: <52148F52.0@huawei.com>
Now we've used effective cpumasks to enforce hierarchical manner,
we can use cs->{cpus,mems}_allowed as configured masks.
Configured masks can be changed by writing cpuset.cpus and cpuset.mems
only. The new behaviors are:
- They won't be changed by hotplug anymore.
- They won't be limited by its parent's masks.
This behavior change won't take effect unless mount with sane_behavior.
Signed-off-by: Li Zefan <lizefan@huawei.com>
---
kernel/cpuset.c | 33 ++++++++++++++++++++++-----------
1 file changed, 22 insertions(+), 11 deletions(-)
diff --git a/kernel/cpuset.c b/kernel/cpuset.c
index e7ad4a7..c3a02a9 100644
--- a/kernel/cpuset.c
+++ b/kernel/cpuset.c
@@ -457,9 +457,13 @@ static int validate_change(struct cpuset *cur, struct cpuset *trial)
par = parent_cs(cur);
- /* We must be a subset of our parent cpuset */
+ /*
+ * We must be a subset of our parent cpuset, unless sane_behavior
+ * flag is set.
+ */
ret = -EACCES;
- if (!is_cpuset_subset(trial, par))
+ if (!cgroup_sane_behavior(cur->css.cgroup) &&
+ !is_cpuset_subset(trial, par))
goto out;
/*
@@ -780,7 +784,7 @@ static void rebuild_sched_domains_locked(void)
* passing doms with offlined cpu to partition_sched_domains().
* Anyways, hotplug work item will rebuild sched domains.
*/
- if (!cpumask_equal(top_cpuset.cpus_allowed, cpu_active_mask))
+ if (!cpumask_equal(top_cpuset.real_cpus_allowed, cpu_active_mask))
goto out;
/* Generate domain masks and attrs */
@@ -2159,11 +2163,14 @@ retry:
goto retry;
}
- cpumask_andnot(&off_cpus, cs->cpus_allowed, top_cpuset.cpus_allowed);
- nodes_andnot(off_mems, cs->mems_allowed, top_cpuset.mems_allowed);
+ cpumask_andnot(&off_cpus, cs->real_cpus_allowed,
+ top_cpuset.real_cpus_allowed);
+ nodes_andnot(off_mems, cs->real_mems_allowed,
+ top_cpuset.real_mems_allowed);
mutex_lock(&callback_mutex);
- cpumask_andnot(cs->cpus_allowed, cs->cpus_allowed, &off_cpus);
+ if (!sane)
+ cpumask_andnot(cs->cpus_allowed, cs->cpus_allowed, &off_cpus);
cpumask_andnot(cs->real_cpus_allowed, cs->real_cpus_allowed,
&off_cpus);
@@ -2184,7 +2191,8 @@ retry:
update_tasks_cpumask(cs, NULL);
mutex_lock(&callback_mutex);
- nodes_andnot(cs->mems_allowed, cs->mems_allowed, off_mems);
+ if (!sane)
+ nodes_andnot(cs->mems_allowed, cs->mems_allowed, off_mems);
nodes_andnot(cs->real_mems_allowed, cs->real_mems_allowed, off_mems);
/* Inherite the effective mask of the parent, if it becomes empty */
@@ -2239,6 +2247,7 @@ static void cpuset_hotplug_workfn(struct work_struct *work)
static cpumask_t new_cpus;
static nodemask_t new_mems;
bool cpus_updated, mems_updated;
+ bool sane = cgroup_sane_behavior(top_cpuset.css.cgroup);
mutex_lock(&cpuset_mutex);
@@ -2246,13 +2255,14 @@ static void cpuset_hotplug_workfn(struct work_struct *work)
cpumask_copy(&new_cpus, cpu_active_mask);
new_mems = node_states[N_MEMORY];
- cpus_updated = !cpumask_equal(top_cpuset.cpus_allowed, &new_cpus);
- mems_updated = !nodes_equal(top_cpuset.mems_allowed, new_mems);
+ cpus_updated = !cpumask_equal(top_cpuset.real_cpus_allowed, &new_cpus);
+ mems_updated = !nodes_equal(top_cpuset.real_mems_allowed, new_mems);
/* synchronize cpus_allowed to cpu_active_mask */
if (cpus_updated) {
mutex_lock(&callback_mutex);
- cpumask_copy(top_cpuset.cpus_allowed, &new_cpus);
+ if (!sane)
+ cpumask_copy(top_cpuset.cpus_allowed, &new_cpus);
cpumask_copy(top_cpuset.real_cpus_allowed, &new_cpus);
mutex_unlock(&callback_mutex);
/* we don't mess with cpumasks of tasks in top_cpuset */
@@ -2261,7 +2271,8 @@ static void cpuset_hotplug_workfn(struct work_struct *work)
/* synchronize mems_allowed to N_MEMORY */
if (mems_updated) {
mutex_lock(&callback_mutex);
- top_cpuset.mems_allowed = new_mems;
+ if (!sane)
+ top_cpuset.mems_allowed = new_mems;
top_cpuset.real_mems_allowed = new_mems;
mutex_unlock(&callback_mutex);
update_tasks_nodemask(&top_cpuset, NULL);
--
1.8.0.2
next prev parent reply other threads:[~2013-08-21 10:00 UTC|newest]
Thread overview: 65+ messages / expand[flat|nested] mbox.gz Atom feed top
2013-08-21 9:58 [PATCH 00/11] cpuset: separate configured masks and effective masks Li Zefan
2013-08-21 9:58 ` Li Zefan
2013-08-21 9:58 ` [PATCH 01/11] cgroup: allow subsystems to create files for sane_behavior only Li Zefan
2013-08-21 9:59 ` [PATCH 03/11] cpuset: update cpuset->real_{cpus,mems}_allowed at hotplug Li Zefan
2013-08-21 9:59 ` [PATCH 06/11] cpuset: apply cs->real_{cpus,mems}_allowed Li Zefan
[not found] ` <52148F9C.2080600-hv44wF8Li93QT0dZR+AlfA@public.gmane.org>
2013-08-21 14:01 ` Tejun Heo
2013-08-21 14:01 ` Tejun Heo
2013-08-21 14:01 ` Tejun Heo
[not found] ` <52148F52.0-hv44wF8Li93QT0dZR+AlfA@public.gmane.org>
2013-08-21 9:58 ` [PATCH 01/11] cgroup: allow subsystems to create files for sane_behavior only Li Zefan
2013-08-21 9:59 ` [PATCH 02/11] cpuset: add cs->real_cpus_allowed and cs->real_mems_allowed Li Zefan
2013-08-21 9:59 ` Li Zefan
[not found] ` <52148F6F.4070507-hv44wF8Li93QT0dZR+AlfA@public.gmane.org>
2013-08-21 13:22 ` Tejun Heo
2013-08-21 13:22 ` Tejun Heo
2013-08-21 9:59 ` Li Zefan
2013-08-21 9:59 ` [PATCH 03/11] cpuset: update cpuset->real_{cpus,mems}_allowed at hotplug Li Zefan
2013-08-21 9:59 ` [PATCH 04/11] cpuset: update cs->real_{cpus, mems}_allowed when config changes Li Zefan
2013-08-21 9:59 ` [PATCH 04/11] cpuset: update cs->real_{cpus,mems}_allowed " Li Zefan
2013-08-21 9:59 ` Li Zefan
[not found] ` <52148F84.9050309-hv44wF8Li93QT0dZR+AlfA@public.gmane.org>
2013-08-21 13:39 ` Tejun Heo
2013-08-21 13:39 ` Tejun Heo
2013-08-21 9:59 ` [PATCH 05/11] cpuset: inherite ancestor's masks if real_{cpus, mems}_allowed become empty Li Zefan
2013-08-21 9:59 ` [PATCH 05/11] cpuset: inherite ancestor's masks if real_{cpus,mems}_allowed " Li Zefan
[not found] ` <52148F90.7070809-hv44wF8Li93QT0dZR+AlfA@public.gmane.org>
2013-08-21 13:44 ` Tejun Heo
2013-08-21 13:44 ` Tejun Heo
2013-08-21 13:44 ` Tejun Heo
2013-08-21 9:59 ` [PATCH 06/11] cpuset: apply cs->real_{cpus,mems}_allowed Li Zefan
2013-08-21 10:00 ` [PATCH 07/11] cpuset: use effective cpumask to build sched domains Li Zefan
2013-08-21 10:00 ` Li Zefan
[not found] ` <52148FA9.806-hv44wF8Li93QT0dZR+AlfA@public.gmane.org>
2013-08-21 14:04 ` Tejun Heo
2013-08-21 14:04 ` Tejun Heo
2013-08-21 10:00 ` [PATCH 08/11] cpuset: separate configured masks and efffective masks Li Zefan
2013-08-21 10:01 ` [PATCH 09/11] cpuset: enable onlined cpu/node in effective masks Li Zefan
2013-08-21 10:01 ` Li Zefan
[not found] ` <52148FE1.3080806-hv44wF8Li93QT0dZR+AlfA@public.gmane.org>
2013-08-21 14:11 ` Tejun Heo
2013-08-21 14:11 ` Tejun Heo
2013-08-21 14:11 ` Tejun Heo
2013-08-21 10:01 ` [PATCH 10/11] cpuset: allow writing offlined masks to cpuset.cpus/mems Li Zefan
2013-08-21 10:01 ` Li Zefan
2013-08-21 10:01 ` Li Zefan
[not found] ` <52148FF1.5060503-hv44wF8Li93QT0dZR+AlfA@public.gmane.org>
2013-08-21 14:18 ` Tejun Heo
2013-08-21 14:18 ` Tejun Heo
[not found] ` <20130821141851.GJ19286-9pTldWuhBndy/B6EtB590w@public.gmane.org>
2013-08-23 7:37 ` Li Zefan
2013-08-23 7:37 ` Li Zefan
2013-08-21 14:18 ` Tejun Heo
2013-08-21 10:01 ` [PATCH 11/11] cpuset: export effective masks to userspace Li Zefan
2013-08-21 10:01 ` Li Zefan
[not found] ` <52148FFC.4080701-hv44wF8Li93QT0dZR+AlfA@public.gmane.org>
2013-08-21 14:20 ` Tejun Heo
2013-08-21 14:20 ` Tejun Heo
[not found] ` <20130821142001.GK19286-9pTldWuhBndy/B6EtB590w@public.gmane.org>
2013-08-23 7:53 ` Li Zefan
2013-08-23 7:53 ` Li Zefan
[not found] ` <52171501.8050401-hv44wF8Li93QT0dZR+AlfA@public.gmane.org>
2013-08-23 12:34 ` Tejun Heo
2013-08-23 12:34 ` Tejun Heo
2013-08-21 14:20 ` Tejun Heo
2013-08-21 14:21 ` [PATCH 00/11] cpuset: separate configured masks and effective masks Tejun Heo
2013-08-21 14:21 ` Tejun Heo
2013-08-21 14:21 ` Tejun Heo
2013-08-21 10:00 ` Li Zefan [this message]
[not found] ` <52148FCA.8010704-hv44wF8Li93QT0dZR+AlfA@public.gmane.org>
2013-08-21 14:08 ` [PATCH 08/11] cpuset: separate configured masks and efffective masks Tejun Heo
2013-08-21 14:08 ` Tejun Heo
[not found] ` <20130821140846.GH19286-9pTldWuhBndy/B6EtB590w@public.gmane.org>
2013-08-23 7:46 ` Li Zefan
2013-08-23 7:46 ` Li Zefan
2013-08-23 7:46 ` Li Zefan
[not found] ` <52171367.90005-hv44wF8Li93QT0dZR+AlfA@public.gmane.org>
2013-08-23 15:33 ` Tejun Heo
2013-08-23 15:33 ` Tejun Heo
2013-08-23 15:33 ` Tejun Heo
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=52148FCA.8010704@huawei.com \
--to=lizefan@huawei.com \
--cc=cgroups@vger.kernel.org \
--cc=containers@lists.linux-foundation.org \
--cc=linux-kernel@vger.kernel.org \
--cc=tj@kernel.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.