From 15c53c1419407ca516f31fcc945e93cf6b174666 Mon Sep 17 00:00:00 2001 From: Matt Helsley Date: Fri, 26 Mar 2010 23:51:44 +0100 Subject: [PATCH] --- yaml --- r: 189389 b: refs/heads/master c: 5a7aadfe2fcb0f69e2acc1fbefe22a096e792fc9 h: refs/heads/master i: 189387: cef550543b71285cde060438c7a7920f464216f7 v: v3 --- [refs] | 2 +- trunk/include/linux/freezer.h | 7 +++++-- trunk/kernel/cgroup_freezer.c | 9 ++++++--- trunk/kernel/power/process.c | 2 +- 4 files changed, 13 insertions(+), 7 deletions(-) diff --git a/[refs] b/[refs] index d22cf98fa845..969b9f8ccc2d 100644 --- a/[refs] +++ b/[refs] @@ -1,2 +1,2 @@ --- -refs/heads/master: 4f598458ea4450f53e8ed929ee4e66b3404a7286 +refs/heads/master: 5a7aadfe2fcb0f69e2acc1fbefe22a096e792fc9 diff --git a/trunk/include/linux/freezer.h b/trunk/include/linux/freezer.h index 5a361f85cfec..da7e52b099f3 100644 --- a/trunk/include/linux/freezer.h +++ b/trunk/include/linux/freezer.h @@ -64,9 +64,12 @@ extern bool freeze_task(struct task_struct *p, bool sig_only); extern void cancel_freezing(struct task_struct *p); #ifdef CONFIG_CGROUP_FREEZER -extern int cgroup_frozen(struct task_struct *task); +extern int cgroup_freezing_or_frozen(struct task_struct *task); #else /* !CONFIG_CGROUP_FREEZER */ -static inline int cgroup_frozen(struct task_struct *task) { return 0; } +static inline int cgroup_freezing_or_frozen(struct task_struct *task) +{ + return 0; +} #endif /* !CONFIG_CGROUP_FREEZER */ /* diff --git a/trunk/kernel/cgroup_freezer.c b/trunk/kernel/cgroup_freezer.c index 59e9ef6aab40..eb3f34d57419 100644 --- a/trunk/kernel/cgroup_freezer.c +++ b/trunk/kernel/cgroup_freezer.c @@ -47,17 +47,20 @@ static inline struct freezer *task_freezer(struct task_struct *task) struct freezer, css); } -int cgroup_frozen(struct task_struct *task) +int cgroup_freezing_or_frozen(struct task_struct *task) { struct freezer *freezer; enum freezer_state state; task_lock(task); freezer = task_freezer(task); - state = freezer->state; + if (!freezer->css.cgroup->parent) + state = CGROUP_THAWED; /* root cgroup can't be frozen */ + else + state = freezer->state; task_unlock(task); - return state == CGROUP_FROZEN; + return (state == CGROUP_FREEZING) || (state == CGROUP_FROZEN); } /* diff --git a/trunk/kernel/power/process.c b/trunk/kernel/power/process.c index a0480cd4daaf..71ae29052ab6 100644 --- a/trunk/kernel/power/process.c +++ b/trunk/kernel/power/process.c @@ -144,7 +144,7 @@ static void thaw_tasks(bool nosig_only) if (nosig_only && should_send_signal(p)) continue; - if (cgroup_frozen(p)) + if (cgroup_freezing_or_frozen(p)) continue; thaw_process(p);