From: Rafael J. Wysocki Date: Wed, 21 Dec 2011 20:59:45 +0000 (+0100) Subject: Merge branch 'master' into pm-sleep X-Git-Url: https://git.karo-electronics.de/?a=commitdiff_plain;h=b00f4dc5ff022cb9cbaffd376d9454d7fa1e496f;p=linux-beck.git Merge branch 'master' into pm-sleep * master: (848 commits) SELinux: Fix RCU deref check warning in sel_netport_insert() binary_sysctl(): fix memory leak mm/vmalloc.c: remove static declaration of va from __get_vm_area_node ipmi_watchdog: restore settings when BMC reset oom: fix integer overflow of points in oom_badness memcg: keep root group unchanged if creation fails nilfs2: potential integer overflow in nilfs_ioctl_clean_segments() nilfs2: unbreak compat ioctl cpusets: stall when updating mems_allowed for mempolicy or disjoint nodemask evm: prevent racing during tfm allocation evm: key must be set once during initialization mmc: vub300: fix type of firmware_rom_wait_states module parameter Revert "mmc: enable runtime PM by default" mmc: sdhci: remove "state" argument from sdhci_suspend_host x86, dumpstack: Fix code bytes breakage due to missing KERN_CONT IB/qib: Correct sense on freectxts increment and decrement RDMA/cma: Verify private data length cgroups: fix a css_set not found bug in cgroup_attach_proc oprofile: Fix uninitialized memory access when writing to writing to oprofilefs Revert "xen/pv-on-hvm kexec: add xs_reset_watches to shutdown watches from old kernel" ... Conflicts: kernel/cgroup_freezer.c --- b00f4dc5ff022cb9cbaffd376d9454d7fa1e496f diff --cc kernel/cgroup_freezer.c index e411a60cc2c8,213c0351dad8..fcb93fca782d --- a/kernel/cgroup_freezer.c +++ b/kernel/cgroup_freezer.c @@@ -145,13 -150,16 +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 @@@ -224,7 -238,7 +231,7 @@@ static void update_if_frozen(struct cgr cgroup_iter_start(cgroup, &it); while ((task = cgroup_iter_next(cgroup, &it))) { ntotal++; - if (freezing(task) && frozen(task)) - if (is_task_frozen_enough(task)) ++ if (freezing(task) && is_task_frozen_enough(task)) nfrozen++; } @@@ -272,11 -286,12 +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++;