Changes in V3: * Fixed to put error in retval (thanks Frederic Weisbecker) * https://lkml.org/lkml/2011/12/20/255 Changes in V2: * Updated commit message as per Tejun's feedback: * https://lkml.org/lkml/2011/12/19/289 -- >8 -- (snip) We can now assume that the css_set reference held by the task will not go away for an exiting task. PF_EXITING state can be trusted throughout migration by checking it after locking threadgroup. While at it, renamed css_set_check_fetched to css_set_fetched. !css_set_fetched() seems to read better than !css_set_check_fetched(). Signed-off-by: Mandeep Singh Baines <msb@xxxxxxxxxxxx> Cc: Tejun Heo <tj@xxxxxxxxxx> Cc: Li Zefan <lizf@xxxxxxxxxxxxxx> Cc: containers@xxxxxxxxxxxxxxxxxxxxxxxxxx Cc: cgroups@xxxxxxxxxxxxxxx Cc: KAMEZAWA Hiroyuki <kamezawa.hiroyu@xxxxxxxxxxxxxx> Cc: Frederic Weisbecker <fweisbec@xxxxxxxxx> Cc: Oleg Nesterov <oleg@xxxxxxxxxx> Cc: Andrew Morton <akpm@xxxxxxxxxxxxxxxxxxxx> Cc: Paul Menage <paul@xxxxxxxxxxxxxx> --- kernel/cgroup.c | 25 ++++++------------------- 1 files changed, 6 insertions(+), 19 deletions(-) diff --git a/kernel/cgroup.c b/kernel/cgroup.c index bc3caff..4166066 100644 --- a/kernel/cgroup.c +++ b/kernel/cgroup.c @@ -1856,7 +1856,6 @@ static int cgroup_task_migrate(struct cgroup *cgrp, struct cgroup *oldcgrp, */ task_lock(tsk); oldcg = tsk->cgroups; - get_css_set(oldcg); task_unlock(tsk); /* locate or allocate a new css_set for this task. */ @@ -1872,12 +1871,9 @@ static int cgroup_task_migrate(struct cgroup *cgrp, struct cgroup *oldcgrp, might_sleep(); /* find_css_set will give us newcg already referenced. */ newcg = find_css_set(oldcg, cgrp); - if (!newcg) { - put_css_set(oldcg); + if (!newcg) return -ENOMEM; - } } - put_css_set(oldcg); /* @tsk can't exit as its threadgroup is locked */ task_lock(tsk); @@ -2015,9 +2011,8 @@ struct cg_list_entry { struct list_head links; }; -static bool css_set_check_fetched(struct cgroup *cgrp, - struct task_struct *tsk, struct css_set *cg, - struct list_head *newcg_list) +static bool css_set_fetched(struct cgroup *cgrp, struct task_struct *tsk, + struct css_set *cg, struct list_head *newcg_list) { struct css_set *newcg; struct cg_list_entry *cg_entry; @@ -2185,19 +2180,11 @@ int cgroup_attach_proc(struct cgroup *cgrp, struct task_struct *leader) /* get old css_set pointer */ task_lock(tc->task); oldcg = tc->task->cgroups; - get_css_set(oldcg); task_unlock(tc->task); - /* see if the new one for us is already in the list? */ - if (css_set_check_fetched(cgrp, tc->task, oldcg, &newcg_list)) { - /* was already there, nothing to do. */ - put_css_set(oldcg); - } else { - /* we don't already have it. get new one. */ - retval = css_set_prefetch(cgrp, oldcg, &newcg_list); - put_css_set(oldcg); - if (retval) + /* if we don't already have it in the list get a new one */ + if (!css_set_fetched(cgrp, tc->task, oldcg, &newcg_list)) + if (retval = css_set_prefetch(cgrp, oldcg, &newcg_list)) goto out_list_teardown; - } } /* -- 1.7.3.1 _______________________________________________ Containers mailing list Containers@xxxxxxxxxxxxxxxxxxxxxxxxxx https://lists.linuxfoundation.org/mailman/listinfo/containers