From: Stephen Rothwell Date: Wed, 30 Nov 2011 02:44:17 +0000 (+1100) Subject: Merge remote-tracking branch 'pm/linux-next' X-Git-Tag: next-20111130~25 X-Git-Url: https://git.karo-electronics.de/?a=commitdiff_plain;h=448e2109842418b8ba4eb24a234caa102d60fc22;p=karo-tx-linux.git Merge remote-tracking branch 'pm/linux-next' Conflicts: kernel/cgroup_freezer.c --- 448e2109842418b8ba4eb24a234caa102d60fc22 diff --cc kernel/cgroup_freezer.c index 213c0351dad8,e411a60cc2c8..f65bc2861227 --- a/kernel/cgroup_freezer.c +++ b/kernel/cgroup_freezer.c @@@ -150,16 -145,13 +145,20 @@@ static struct cgroup_subsys_state *free static void freezer_destroy(struct cgroup_subsys *ss, struct cgroup *cgroup) { - kfree(cgroup_freezer(cgroup)); + struct freezer *freezer = cgroup_freezer(cgroup); + + if (freezer->state != CGROUP_THAWED) + atomic_dec(&system_freezing_cnt); + kfree(freezer); } +/* task is frozen or will freeze immediately when next it gets woken */ +static bool is_task_frozen_enough(struct task_struct *task) +{ + return frozen(task) || + (task_is_stopped_or_traced(task) && freezing(task)); +} + /* * The call to cgroup_lock() in the freezer.state write method prevents * a write to that file racing against an attach, and hence the @@@ -238,7 -224,7 +231,7 @@@ static void update_if_frozen(struct cgr cgroup_iter_start(cgroup, &it); while ((task = cgroup_iter_next(cgroup, &it))) { ntotal++; - if (is_task_frozen_enough(task)) - if (freezing(task) && frozen(task)) ++ if (freezing(task) || is_task_frozen_enough(task)) nfrozen++; } @@@ -286,12 -272,11 +279,11 @@@ static int try_to_freeze_cgroup(struct struct task_struct *task; unsigned int num_cant_freeze_now = 0; - freezer->state = CGROUP_FREEZING; cgroup_iter_start(cgroup, &it); while ((task = cgroup_iter_next(cgroup, &it))) { - if (!freeze_task(task, true)) + if (!freeze_task(task)) continue; - if (frozen(task)) + if (is_task_frozen_enough(task)) continue; if (!freezing(task) && !freezer_should_skip(task)) num_cant_freeze_now++;