public inbox for cgroups@vger.kernel.org
 help / color / mirror / Atom feed
From: Li Zefan <lizefan-hv44wF8Li93QT0dZR+AlfA@public.gmane.org>
To: Tejun Heo <tj-DgEjT+Ai2ygdnm+yROfE0A@public.gmane.org>
Cc: Cgroups <cgroups-u79uwXL29TY76Z2rM5mHXA@public.gmane.org>,
	Containers
	<containers-cunTk1MwBs9QetFLy7KEm3xJsTq8ys+cHZ5vskTnxNA@public.gmane.org>,
	LKML <linux-kernel-u79uwXL29TY76Z2rM5mHXA@public.gmane.org>
Subject: [PATCH 05/11] cpuset: inherite ancestor's masks if real_{cpus, mems}_allowed become empty
Date: Wed, 21 Aug 2013 17:59:44 +0800	[thread overview]
Message-ID: <52148F90.7070809@huawei.com> (raw)
In-Reply-To: <52148F52.0-hv44wF8Li93QT0dZR+AlfA@public.gmane.org>

We're going to have separate user-configured masks and effective ones.

At last configured masks can only be changed by writing cpuset.cpus
and cpuset.mems, and they won't be restricted by parent cpuset. While
effective masks reflect cpu/memory hotplug and hierachical restriction.

This is a preparation to make real_{cpus,mems}_allowed to be effective
masks of the cpuset:

- change the effective masks at hotplug: done
- change the effective masks at config change: done
- take on ancestor's mask when the effective mask is empty: done

This won't introduce behavior change.

Signed-off-by: Li Zefan <lizefan-hv44wF8Li93QT0dZR+AlfA@public.gmane.org>
---
 kernel/cpuset.c | 33 +++++++++++++++++++++++----------
 1 file changed, 23 insertions(+), 10 deletions(-)

diff --git a/kernel/cpuset.c b/kernel/cpuset.c
index 72afef4..b7b63dd 100644
--- a/kernel/cpuset.c
+++ b/kernel/cpuset.c
@@ -904,12 +904,14 @@ static void update_cpumasks_hier(struct cpuset *cs, struct cpuset *trialcs,
 			    parent->real_cpus_allowed);
 
 		/*
-		 * Skip the whole subtree if the cpumask is not changed, unless
-		 * it's empty, and in this case we need to update tasks to take
-		 * on an ancestor's cpumask.
+		 * If it becomes empty, inherite the effective mask of the
+		 * parent, which is guarantted to have some CPUs.
 		 */
-		if (cpumask_equal(new_cpus, cp->real_cpus_allowed) &&
-		    ((cp == cs) || !cpumask_empty(new_cpus))) {
+		if (cpumask_empty(new_cpus))
+			cpumask_copy(new_cpus, parent->real_cpus_allowed);
+
+		/* Skip the whole subtree if the cpumask is not changed. */
+		if (cpumask_equal(new_cpus, cp->real_cpus_allowed)) {
 			pos_css = css_rightmost_descendant(pos_css);
 			continue;
 		}
@@ -1168,12 +1170,14 @@ static void update_nodemasks_hier(struct cpuset *cs, struct cpuset *trialcs,
 			  parent->real_mems_allowed);
 
 		/*
-		 * Skip the whole subtree if the nodemask is not changed, unless
-		 * it's empty, and in this case we need to update tasks to take
-		 * on an ancestor's nodemask.
+		 * If it becoms empty, inherite the effective mask of the
+		 * parent, which is guaranteed to have some MEMs.
 		 */
-		if (nodes_equal(*new_mems, cp->real_mems_allowed) &&
-		    ((cp == cs) || !nodes_empty(*new_mems))) {
+		if (nodes_empty(*new_mems))
+			*new_mems = parent->real_mems_allowed;
+
+		/* Skip the whole subtree if the nodemask is not changed. */
+		if (nodes_equal(*new_mems, cp->real_mems_allowed)) {
 			pos_css = css_rightmost_descendant(pos_css);
 			continue;
 		}
@@ -2202,8 +2206,13 @@ retry:
 
 	mutex_lock(&callback_mutex);
 	cpumask_andnot(cs->cpus_allowed, cs->cpus_allowed, &off_cpus);
+
 	cpumask_andnot(cs->real_cpus_allowed, cs->real_cpus_allowed,
 		       &off_cpus);
+	/* Inherite the effective mask of the parent, if it becomes empty */
+	if (cpumask_empty(cs->real_cpus_allowed))
+		cpumask_copy(cs->real_cpus_allowed,
+			     parent_cs(cs)->real_cpus_allowed);
 	mutex_unlock(&callback_mutex);
 
 	/*
@@ -2218,7 +2227,11 @@ retry:
 
 	mutex_lock(&callback_mutex);
 	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 */
+	if (nodes_empty(cs->real_mems_allowed))
+		cs->real_mems_allowed = parent_cs(cs)->real_mems_allowed;
 	mutex_unlock(&callback_mutex);
 
 	/*
-- 
1.8.0.2

  parent reply	other threads:[~2013-08-21  9:59 UTC|newest]

Thread overview: 27+ 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 ` [PATCH 01/11] cgroup: allow subsystems to create files for sane_behavior only Li Zefan
     [not found] ` <52148F52.0-hv44wF8Li93QT0dZR+AlfA@public.gmane.org>
2013-08-21  9:59   ` [PATCH 02/11] cpuset: add cs->real_cpus_allowed and cs->real_mems_allowed Li Zefan
     [not found]     ` <52148F6F.4070507-hv44wF8Li93QT0dZR+AlfA@public.gmane.org>
2013-08-21 13:22       ` Tejun Heo
2013-08-21  9:59   ` [PATCH 04/11] cpuset: update cs->real_{cpus,mems}_allowed when config changes Li Zefan
     [not found]     ` <52148F84.9050309-hv44wF8Li93QT0dZR+AlfA@public.gmane.org>
2013-08-21 13:39       ` Tejun Heo
2013-08-21  9:59   ` Li Zefan [this message]
     [not found]     ` <52148F90.7070809-hv44wF8Li93QT0dZR+AlfA@public.gmane.org>
2013-08-21 13:44       ` [PATCH 05/11] cpuset: inherite ancestor's masks if real_{cpus,mems}_allowed become empty Tejun Heo
2013-08-21 10:00   ` [PATCH 07/11] cpuset: use effective cpumask to build sched domains Li Zefan
     [not found]     ` <52148FA9.806-hv44wF8Li93QT0dZR+AlfA@public.gmane.org>
2013-08-21 14:04       ` Tejun Heo
2013-08-21 10:01   ` [PATCH 09/11] cpuset: enable onlined cpu/node in effective masks Li Zefan
     [not found]     ` <52148FE1.3080806-hv44wF8Li93QT0dZR+AlfA@public.gmane.org>
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
     [not found]     ` <52148FF1.5060503-hv44wF8Li93QT0dZR+AlfA@public.gmane.org>
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-21 10:01   ` [PATCH 11/11] cpuset: export effective masks to userspace Li Zefan
     [not found]     ` <52148FFC.4080701-hv44wF8Li93QT0dZR+AlfA@public.gmane.org>
2013-08-21 14:20       ` Tejun Heo
     [not found]         ` <20130821142001.GK19286-9pTldWuhBndy/B6EtB590w@public.gmane.org>
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-21 14:21   ` [PATCH 00/11] cpuset: separate configured masks and effective masks Tejun Heo
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 10:00 ` [PATCH 08/11] cpuset: separate configured masks and efffective masks Li Zefan
     [not found]   ` <52148FCA.8010704-hv44wF8Li93QT0dZR+AlfA@public.gmane.org>
2013-08-21 14:08     ` Tejun Heo
     [not found]       ` <20130821140846.GH19286-9pTldWuhBndy/B6EtB590w@public.gmane.org>
2013-08-23  7:46         ` Li Zefan
     [not found]           ` <52171367.90005-hv44wF8Li93QT0dZR+AlfA@public.gmane.org>
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=52148F90.7070809@huawei.com \
    --to=lizefan-hv44wf8li93qt0dzr+alfa@public.gmane.org \
    --cc=cgroups-u79uwXL29TY76Z2rM5mHXA@public.gmane.org \
    --cc=containers-cunTk1MwBs9QetFLy7KEm3xJsTq8ys+cHZ5vskTnxNA@public.gmane.org \
    --cc=linux-kernel-u79uwXL29TY76Z2rM5mHXA@public.gmane.org \
    --cc=tj-DgEjT+Ai2ygdnm+yROfE0A@public.gmane.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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox