diff options
-rw-r--r-- | include/linux/freezer.h | 7 | ||||
-rw-r--r-- | kernel/cgroup_freezer.c | 9 | ||||
-rw-r--r-- | kernel/power/process.c | 2 |
3 files changed, 12 insertions, 6 deletions
diff --git a/include/linux/freezer.h b/include/linux/freezer.h index 5a361f85cfec..da7e52b099f3 100644 --- a/include/linux/freezer.h +++ b/include/linux/freezer.h | |||
@@ -64,9 +64,12 @@ extern bool freeze_task(struct task_struct *p, bool sig_only); | |||
64 | extern void cancel_freezing(struct task_struct *p); | 64 | extern void cancel_freezing(struct task_struct *p); |
65 | 65 | ||
66 | #ifdef CONFIG_CGROUP_FREEZER | 66 | #ifdef CONFIG_CGROUP_FREEZER |
67 | extern int cgroup_frozen(struct task_struct *task); | 67 | extern int cgroup_freezing_or_frozen(struct task_struct *task); |
68 | #else /* !CONFIG_CGROUP_FREEZER */ | 68 | #else /* !CONFIG_CGROUP_FREEZER */ |
69 | static inline int cgroup_frozen(struct task_struct *task) { return 0; } | 69 | static inline int cgroup_freezing_or_frozen(struct task_struct *task) |
70 | { | ||
71 | return 0; | ||
72 | } | ||
70 | #endif /* !CONFIG_CGROUP_FREEZER */ | 73 | #endif /* !CONFIG_CGROUP_FREEZER */ |
71 | 74 | ||
72 | /* | 75 | /* |
diff --git a/kernel/cgroup_freezer.c b/kernel/cgroup_freezer.c index 59e9ef6aab40..eb3f34d57419 100644 --- a/kernel/cgroup_freezer.c +++ b/kernel/cgroup_freezer.c | |||
@@ -47,17 +47,20 @@ static inline struct freezer *task_freezer(struct task_struct *task) | |||
47 | struct freezer, css); | 47 | struct freezer, css); |
48 | } | 48 | } |
49 | 49 | ||
50 | int cgroup_frozen(struct task_struct *task) | 50 | int cgroup_freezing_or_frozen(struct task_struct *task) |
51 | { | 51 | { |
52 | struct freezer *freezer; | 52 | struct freezer *freezer; |
53 | enum freezer_state state; | 53 | enum freezer_state state; |
54 | 54 | ||
55 | task_lock(task); | 55 | task_lock(task); |
56 | freezer = task_freezer(task); | 56 | freezer = task_freezer(task); |
57 | state = freezer->state; | 57 | if (!freezer->css.cgroup->parent) |
58 | state = CGROUP_THAWED; /* root cgroup can't be frozen */ | ||
59 | else | ||
60 | state = freezer->state; | ||
58 | task_unlock(task); | 61 | task_unlock(task); |
59 | 62 | ||
60 | return state == CGROUP_FROZEN; | 63 | return (state == CGROUP_FREEZING) || (state == CGROUP_FROZEN); |
61 | } | 64 | } |
62 | 65 | ||
63 | /* | 66 | /* |
diff --git a/kernel/power/process.c b/kernel/power/process.c index a0480cd4daaf..71ae29052ab6 100644 --- a/kernel/power/process.c +++ b/kernel/power/process.c | |||
@@ -144,7 +144,7 @@ static void thaw_tasks(bool nosig_only) | |||
144 | if (nosig_only && should_send_signal(p)) | 144 | if (nosig_only && should_send_signal(p)) |
145 | continue; | 145 | continue; |
146 | 146 | ||
147 | if (cgroup_frozen(p)) | 147 | if (cgroup_freezing_or_frozen(p)) |
148 | continue; | 148 | continue; |
149 | 149 | ||
150 | thaw_process(p); | 150 | thaw_process(p); |