diff options
Diffstat (limited to 'kernel/cgroup_freezer.c')
| -rw-r--r-- | kernel/cgroup_freezer.c | 15 |
1 files changed, 14 insertions, 1 deletions
diff --git a/kernel/cgroup_freezer.c b/kernel/cgroup_freezer.c index fb249e2bcada..59e9ef6aab40 100644 --- a/kernel/cgroup_freezer.c +++ b/kernel/cgroup_freezer.c | |||
| @@ -159,7 +159,7 @@ static bool is_task_frozen_enough(struct task_struct *task) | |||
| 159 | */ | 159 | */ |
| 160 | static int freezer_can_attach(struct cgroup_subsys *ss, | 160 | static int freezer_can_attach(struct cgroup_subsys *ss, |
| 161 | struct cgroup *new_cgroup, | 161 | struct cgroup *new_cgroup, |
| 162 | struct task_struct *task) | 162 | struct task_struct *task, bool threadgroup) |
| 163 | { | 163 | { |
| 164 | struct freezer *freezer; | 164 | struct freezer *freezer; |
| 165 | 165 | ||
| @@ -177,6 +177,19 @@ static int freezer_can_attach(struct cgroup_subsys *ss, | |||
| 177 | if (freezer->state == CGROUP_FROZEN) | 177 | if (freezer->state == CGROUP_FROZEN) |
| 178 | return -EBUSY; | 178 | return -EBUSY; |
| 179 | 179 | ||
| 180 | if (threadgroup) { | ||
| 181 | struct task_struct *c; | ||
| 182 | |||
| 183 | rcu_read_lock(); | ||
| 184 | list_for_each_entry_rcu(c, &task->thread_group, thread_group) { | ||
| 185 | if (is_task_frozen_enough(c)) { | ||
| 186 | rcu_read_unlock(); | ||
| 187 | return -EBUSY; | ||
| 188 | } | ||
| 189 | } | ||
| 190 | rcu_read_unlock(); | ||
| 191 | } | ||
| 192 | |||
| 180 | return 0; | 193 | return 0; |
| 181 | } | 194 | } |
| 182 | 195 | ||
