Merge branch 'for-3.3' of git://git.kernel.org/pub/scm/linux/kernel/git/tj/cgroup
* 'for-3.3' of git://git.kernel.org/pub/scm/linux/kernel/git/tj/cgroup: (21 commits)
cgroup: fix to allow mounting a hierarchy by name
cgroup: move assignement out of condition in cgroup_attach_proc()
cgroup: Remove task_lock() from cgroup_post_fork()
cgroup: add sparse annotation to cgroup_iter_start() and cgroup_iter_end()
cgroup: mark cgroup_rmdir_waitq and cgroup_attach_proc() as static
cgroup: only need to check oldcgrp==newgrp once
cgroup: remove redundant get/put of task struct
cgroup: remove redundant get/put of old css_set from migrate
cgroup: Remove unnecessary task_lock before fetching css_set on migration
cgroup: Drop task_lock(parent) on cgroup_fork()
cgroups: remove redundant get/put of css_set from css_set_check_fetched()
resource cgroups: remove bogus cast
cgroup: kill subsys->can_attach_task(), pre_attach() and attach_task()
cgroup, cpuset: don't use ss->pre_attach()
cgroup: don't use subsys->can_attach_task() or ->attach_task()
cgroup: introduce cgroup_taskset and use it in subsys->can_attach(), cancel_attach() and attach()
cgroup: improve old cgroup handling in cgroup_attach_proc()
cgroup: always lock threadgroup during migration
threadgroup: extend threadgroup_lock() to cover exit and exec
threadgroup: rename signal->threadgroup_fork_lock to ->group_rwsem
...
Fix up conflict in kernel/cgroup.c due to commit e0197aae59
: "cgroups:
fix a css_set not found bug in cgroup_attach_proc" that already
mentioned that the bug is fixed (differently) in Tejun's cgroup
patchset. This one, in other words.
This commit is contained in:
commit
db0c2bf69a
15 changed files with 471 additions and 350 deletions
107
kernel/cpuset.c
107
kernel/cpuset.c
|
@ -1389,79 +1389,73 @@ static int fmeter_getrate(struct fmeter *fmp)
|
|||
return val;
|
||||
}
|
||||
|
||||
/* Called by cgroups to determine if a cpuset is usable; cgroup_mutex held */
|
||||
static int cpuset_can_attach(struct cgroup_subsys *ss, struct cgroup *cont,
|
||||
struct task_struct *tsk)
|
||||
{
|
||||
struct cpuset *cs = cgroup_cs(cont);
|
||||
|
||||
if (cpumask_empty(cs->cpus_allowed) || nodes_empty(cs->mems_allowed))
|
||||
return -ENOSPC;
|
||||
|
||||
/*
|
||||
* Kthreads bound to specific cpus cannot be moved to a new cpuset; we
|
||||
* cannot change their cpu affinity and isolating such threads by their
|
||||
* set of allowed nodes is unnecessary. Thus, cpusets are not
|
||||
* applicable for such threads. This prevents checking for success of
|
||||
* set_cpus_allowed_ptr() on all attached tasks before cpus_allowed may
|
||||
* be changed.
|
||||
*/
|
||||
if (tsk->flags & PF_THREAD_BOUND)
|
||||
return -EINVAL;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int cpuset_can_attach_task(struct cgroup *cgrp, struct task_struct *task)
|
||||
{
|
||||
return security_task_setscheduler(task);
|
||||
}
|
||||
|
||||
/*
|
||||
* Protected by cgroup_lock. The nodemasks must be stored globally because
|
||||
* dynamically allocating them is not allowed in pre_attach, and they must
|
||||
* persist among pre_attach, attach_task, and attach.
|
||||
* dynamically allocating them is not allowed in can_attach, and they must
|
||||
* persist until attach.
|
||||
*/
|
||||
static cpumask_var_t cpus_attach;
|
||||
static nodemask_t cpuset_attach_nodemask_from;
|
||||
static nodemask_t cpuset_attach_nodemask_to;
|
||||
|
||||
/* Set-up work for before attaching each task. */
|
||||
static void cpuset_pre_attach(struct cgroup *cont)
|
||||
/* Called by cgroups to determine if a cpuset is usable; cgroup_mutex held */
|
||||
static int cpuset_can_attach(struct cgroup_subsys *ss, struct cgroup *cgrp,
|
||||
struct cgroup_taskset *tset)
|
||||
{
|
||||
struct cpuset *cs = cgroup_cs(cont);
|
||||
struct cpuset *cs = cgroup_cs(cgrp);
|
||||
struct task_struct *task;
|
||||
int ret;
|
||||
|
||||
if (cpumask_empty(cs->cpus_allowed) || nodes_empty(cs->mems_allowed))
|
||||
return -ENOSPC;
|
||||
|
||||
cgroup_taskset_for_each(task, cgrp, tset) {
|
||||
/*
|
||||
* Kthreads bound to specific cpus cannot be moved to a new
|
||||
* cpuset; we cannot change their cpu affinity and
|
||||
* isolating such threads by their set of allowed nodes is
|
||||
* unnecessary. Thus, cpusets are not applicable for such
|
||||
* threads. This prevents checking for success of
|
||||
* set_cpus_allowed_ptr() on all attached tasks before
|
||||
* cpus_allowed may be changed.
|
||||
*/
|
||||
if (task->flags & PF_THREAD_BOUND)
|
||||
return -EINVAL;
|
||||
if ((ret = security_task_setscheduler(task)))
|
||||
return ret;
|
||||
}
|
||||
|
||||
/* prepare for attach */
|
||||
if (cs == &top_cpuset)
|
||||
cpumask_copy(cpus_attach, cpu_possible_mask);
|
||||
else
|
||||
guarantee_online_cpus(cs, cpus_attach);
|
||||
|
||||
guarantee_online_mems(cs, &cpuset_attach_nodemask_to);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
/* Per-thread attachment work. */
|
||||
static void cpuset_attach_task(struct cgroup *cont, struct task_struct *tsk)
|
||||
{
|
||||
int err;
|
||||
struct cpuset *cs = cgroup_cs(cont);
|
||||
|
||||
/*
|
||||
* can_attach beforehand should guarantee that this doesn't fail.
|
||||
* TODO: have a better way to handle failure here
|
||||
*/
|
||||
err = set_cpus_allowed_ptr(tsk, cpus_attach);
|
||||
WARN_ON_ONCE(err);
|
||||
|
||||
cpuset_change_task_nodemask(tsk, &cpuset_attach_nodemask_to);
|
||||
cpuset_update_task_spread_flag(cs, tsk);
|
||||
}
|
||||
|
||||
static void cpuset_attach(struct cgroup_subsys *ss, struct cgroup *cont,
|
||||
struct cgroup *oldcont, struct task_struct *tsk)
|
||||
static void cpuset_attach(struct cgroup_subsys *ss, struct cgroup *cgrp,
|
||||
struct cgroup_taskset *tset)
|
||||
{
|
||||
struct mm_struct *mm;
|
||||
struct cpuset *cs = cgroup_cs(cont);
|
||||
struct cpuset *oldcs = cgroup_cs(oldcont);
|
||||
struct task_struct *task;
|
||||
struct task_struct *leader = cgroup_taskset_first(tset);
|
||||
struct cgroup *oldcgrp = cgroup_taskset_cur_cgroup(tset);
|
||||
struct cpuset *cs = cgroup_cs(cgrp);
|
||||
struct cpuset *oldcs = cgroup_cs(oldcgrp);
|
||||
|
||||
cgroup_taskset_for_each(task, cgrp, tset) {
|
||||
/*
|
||||
* can_attach beforehand should guarantee that this doesn't
|
||||
* fail. TODO: have a better way to handle failure here
|
||||
*/
|
||||
WARN_ON_ONCE(set_cpus_allowed_ptr(task, cpus_attach));
|
||||
|
||||
cpuset_change_task_nodemask(task, &cpuset_attach_nodemask_to);
|
||||
cpuset_update_task_spread_flag(cs, task);
|
||||
}
|
||||
|
||||
/*
|
||||
* Change mm, possibly for multiple threads in a threadgroup. This is
|
||||
|
@ -1469,7 +1463,7 @@ static void cpuset_attach(struct cgroup_subsys *ss, struct cgroup *cont,
|
|||
*/
|
||||
cpuset_attach_nodemask_from = oldcs->mems_allowed;
|
||||
cpuset_attach_nodemask_to = cs->mems_allowed;
|
||||
mm = get_task_mm(tsk);
|
||||
mm = get_task_mm(leader);
|
||||
if (mm) {
|
||||
mpol_rebind_mm(mm, &cpuset_attach_nodemask_to);
|
||||
if (is_memory_migrate(cs))
|
||||
|
@ -1925,9 +1919,6 @@ struct cgroup_subsys cpuset_subsys = {
|
|||
.create = cpuset_create,
|
||||
.destroy = cpuset_destroy,
|
||||
.can_attach = cpuset_can_attach,
|
||||
.can_attach_task = cpuset_can_attach_task,
|
||||
.pre_attach = cpuset_pre_attach,
|
||||
.attach_task = cpuset_attach_task,
|
||||
.attach = cpuset_attach,
|
||||
.populate = cpuset_populate,
|
||||
.post_clone = cpuset_post_clone,
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue