From: Li Zefan <lizefan-hv44wF8Li93QT0dZR+AlfA@public.gmane.org>
To: Tejun Heo <tj-DgEjT+Ai2ygdnm+yROfE0A@public.gmane.org>
Cc: LKML <linux-kernel-u79uwXL29TY76Z2rM5mHXA@public.gmane.org>,
Cgroups <cgroups-u79uwXL29TY76Z2rM5mHXA@public.gmane.org>,
Containers
<containers-cunTk1MwBs9QetFLy7KEm3xJsTq8ys+cHZ5vskTnxNA@public.gmane.org>
Subject: [PATCH 02/11] cpuset: add cs->real_cpus_allowed and cs->real_mems_allowed
Date: Wed, 21 Aug 2013 17:59:11 +0800 [thread overview]
Message-ID: <52148F6F.4070507@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 patch adds and initializes the effective masks. The effective
masks of the top cpuset is the same with configured masks, and a child
cpuset inherites its parent's effective masks.
This won't introduce behavior change.
Signed-off-by: Li Zefan <lizefan-hv44wF8Li93QT0dZR+AlfA@public.gmane.org>
---
kernel/cpuset.c | 57 ++++++++++++++++++++++++++++++++++++++++++++++-----------
1 file changed, 46 insertions(+), 11 deletions(-)
diff --git a/kernel/cpuset.c b/kernel/cpuset.c
index 70ab3fd..404fea5 100644
--- a/kernel/cpuset.c
+++ b/kernel/cpuset.c
@@ -81,8 +81,14 @@ struct cpuset {
struct cgroup_subsys_state css;
unsigned long flags; /* "unsigned long" so bitops work */
- cpumask_var_t cpus_allowed; /* CPUs allowed to tasks in cpuset */
- nodemask_t mems_allowed; /* Memory Nodes allowed to tasks */
+
+ /* user-configured CPUs and Memory Nodes allow to tasks */
+ cpumask_var_t cpus_allowed;
+ nodemask_t mems_allowed;
+
+ /* effective CPUs and Memory Nodes allow to tasks */
+ cpumask_var_t real_cpus_allowed;
+ nodemask_t real_mems_allowed;
/*
* This is old Memory Nodes tasks took on.
@@ -381,13 +387,20 @@ static struct cpuset *alloc_trial_cpuset(struct cpuset *cs)
if (!trial)
return NULL;
- if (!alloc_cpumask_var(&trial->cpus_allowed, GFP_KERNEL)) {
- kfree(trial);
- return NULL;
- }
- cpumask_copy(trial->cpus_allowed, cs->cpus_allowed);
+ if (!alloc_cpumask_var(&trial->cpus_allowed, GFP_KERNEL))
+ goto free_cs;
+ if (!alloc_cpumask_var(&trial->real_cpus_allowed, GFP_KERNEL))
+ goto free_cpus;
+ cpumask_copy(trial->cpus_allowed, cs->cpus_allowed);
+ cpumask_copy(trial->real_cpus_allowed, cs->real_cpus_allowed);
return trial;
+
+free_cpus:
+ free_cpumask_var(trial->cpus_allowed);
+free_cs:
+ kfree(trial);
+ return NULL;
}
/**
@@ -396,6 +409,7 @@ static struct cpuset *alloc_trial_cpuset(struct cpuset *cs)
*/
static void free_trial_cpuset(struct cpuset *trial)
{
+ free_cpumask_var(trial->real_cpus_allowed);
free_cpumask_var(trial->cpus_allowed);
kfree(trial);
}
@@ -1949,18 +1963,26 @@ cpuset_css_alloc(struct cgroup_subsys_state *parent_css)
cs = kzalloc(sizeof(*cs), GFP_KERNEL);
if (!cs)
return ERR_PTR(-ENOMEM);
- if (!alloc_cpumask_var(&cs->cpus_allowed, GFP_KERNEL)) {
- kfree(cs);
- return ERR_PTR(-ENOMEM);
- }
+ if (!alloc_cpumask_var(&cs->cpus_allowed, GFP_KERNEL))
+ goto free_cs;
+ if (!alloc_cpumask_var(&cs->real_cpus_allowed, GFP_KERNEL))
+ goto free_cpus;
set_bit(CS_SCHED_LOAD_BALANCE, &cs->flags);
cpumask_clear(cs->cpus_allowed);
nodes_clear(cs->mems_allowed);
+ cpumask_clear(cs->real_cpus_allowed);
+ nodes_clear(cs->real_mems_allowed);
fmeter_init(&cs->fmeter);
cs->relax_domain_level = -1;
return &cs->css;
+
+free_cpus:
+ free_cpumask_var(cs->cpus_allowed);
+free_cs:
+ kfree(cs);
+ return ERR_PTR(-ENOMEM);
}
static int cpuset_css_online(struct cgroup_subsys_state *css)
@@ -1983,6 +2005,11 @@ static int cpuset_css_online(struct cgroup_subsys_state *css)
number_of_cpusets++;
+ mutex_lock(&callback_mutex);
+ cpumask_copy(cs->real_cpus_allowed, parent->real_cpus_allowed);
+ cs->real_mems_allowed = parent->real_mems_allowed;
+ mutex_unlock(&callback_mutex);
+
if (!test_bit(CGRP_CPUSET_CLONE_CHILDREN, &css->cgroup->flags))
goto out_unlock;
@@ -2042,6 +2069,7 @@ static void cpuset_css_free(struct cgroup_subsys_state *css)
{
struct cpuset *cs = css_cs(css);
+ free_cpumask_var(cs->real_cpus_allowed);
free_cpumask_var(cs->cpus_allowed);
kfree(cs);
}
@@ -2072,9 +2100,13 @@ int __init cpuset_init(void)
if (!alloc_cpumask_var(&top_cpuset.cpus_allowed, GFP_KERNEL))
BUG();
+ if (!alloc_cpumask_var(&top_cpuset.real_cpus_allowed, GFP_KERNEL))
+ BUG();
cpumask_setall(top_cpuset.cpus_allowed);
nodes_setall(top_cpuset.mems_allowed);
+ cpumask_setall(top_cpuset.real_cpus_allowed);
+ nodes_setall(top_cpuset.real_mems_allowed);
fmeter_init(&top_cpuset.fmeter);
set_bit(CS_SCHED_LOAD_BALANCE, &top_cpuset.flags);
@@ -2312,6 +2344,9 @@ void __init cpuset_init_smp(void)
top_cpuset.mems_allowed = node_states[N_MEMORY];
top_cpuset.old_mems_allowed = top_cpuset.mems_allowed;
+ cpumask_copy(top_cpuset.real_cpus_allowed, cpu_active_mask);
+ top_cpuset.real_mems_allowed = node_states[N_MEMORY];
+
register_hotmemory_notifier(&cpuset_track_online_nodes_nb);
}
--
1.8.0.2
next prev 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 ` Li Zefan [this message]
[not found] ` <52148F6F.4070507-hv44wF8Li93QT0dZR+AlfA@public.gmane.org>
2013-08-21 13:22 ` [PATCH 02/11] cpuset: add cs->real_cpus_allowed and cs->real_mems_allowed 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 ` [PATCH 05/11] cpuset: inherite ancestor's masks if real_{cpus, mems}_allowed become empty Li Zefan
[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 " 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=52148F6F.4070507@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