From: Rafael J. Wysocki Date: Fri, 9 Dec 2011 22:40:33 +0000 (+0100) Subject: Merge branch 'pm-sleep' into linux-next X-Git-Tag: next-20111212~29^2~2 X-Git-Url: https://git.karo-electronics.de/?a=commitdiff_plain;h=d992531c5f1ac255e124847655ba4568d7d08837;p=karo-tx-linux.git Merge branch 'pm-sleep' into linux-next * pm-sleep: (44 commits) PM / Hibernate: Remove deprecated hibernation snapshot ioctls PM / Sleep: Fix freezer failures due to racy usermodehelper_is_disabled() PM / Sleep: Recommend [un]lock_system_sleep() over using pm_mutex directly PM / Sleep: Replace mutex_[un]lock(&pm_mutex) with [un]lock_system_sleep() PM / Sleep: Make [un]lock_system_sleep() generic PM / Sleep: Use the freezer_count() functions in [un]lock_system_sleep() APIs PM / Freezer: Remove the "userspace only" constraint from freezer[_do_not]_count() PM / Hibernate: Replace unintuitive 'if' condition in kernel/power/user.c with 'else' Freezer / sunrpc / NFS: don't allow TASK_KILLABLE sleeps to block the freezer PM / Sleep: Unify diagnostic messages from device suspend/resume ACPI / PM: Do not save/restore NVS on Asus K54C/K54HR PM / Hibernate: Remove deprecated hibernation test modes PM / Hibernate: Thaw processes in SNAPSHOT_CREATE_IMAGE ioctl test path PM / Hibernate: Enable usermodehelpers in software_resume() error path Freezer: fix more fallout from the thaw_process rename PM / Hibernate: Refactor and simplify hibernation_snapshot() code PM / Sleep: Simplify device_suspend_noirq() PM / Sleep: Remove unnecessary label and jumps to it form PM core code PM / Memory-hotplug: Avoid task freezing failures PM: Fix indentation and remove extraneous whitespaces in kernel/power/main.c ... Conflicts: kernel/cgroup_freezer.c kernel/kmod.c --- d992531c5f1ac255e124847655ba4568d7d08837 diff --cc kernel/cgroup_freezer.c index 213c0351dad8,e411a60cc2c8..fcb93fca782d --- 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++;