diff options
Diffstat (limited to 'kernel/cgroup_freezer.c')
| -rw-r--r-- | kernel/cgroup_freezer.c | 19 |
1 files changed, 16 insertions, 3 deletions
diff --git a/kernel/cgroup_freezer.c b/kernel/cgroup_freezer.c index 7fa476f01d05..fb249e2bcada 100644 --- a/kernel/cgroup_freezer.c +++ b/kernel/cgroup_freezer.c | |||
| @@ -184,9 +184,20 @@ static void freezer_fork(struct cgroup_subsys *ss, struct task_struct *task) | |||
| 184 | { | 184 | { |
| 185 | struct freezer *freezer; | 185 | struct freezer *freezer; |
| 186 | 186 | ||
| 187 | task_lock(task); | 187 | /* |
| 188 | * No lock is needed, since the task isn't on tasklist yet, | ||
| 189 | * so it can't be moved to another cgroup, which means the | ||
| 190 | * freezer won't be removed and will be valid during this | ||
| 191 | * function call. | ||
| 192 | */ | ||
| 188 | freezer = task_freezer(task); | 193 | freezer = task_freezer(task); |
| 189 | task_unlock(task); | 194 | |
| 195 | /* | ||
| 196 | * The root cgroup is non-freezable, so we can skip the | ||
| 197 | * following check. | ||
| 198 | */ | ||
| 199 | if (!freezer->css.cgroup->parent) | ||
| 200 | return; | ||
| 190 | 201 | ||
| 191 | spin_lock_irq(&freezer->lock); | 202 | spin_lock_irq(&freezer->lock); |
| 192 | BUG_ON(freezer->state == CGROUP_FROZEN); | 203 | BUG_ON(freezer->state == CGROUP_FROZEN); |
| @@ -331,7 +342,7 @@ static int freezer_write(struct cgroup *cgroup, | |||
| 331 | else if (strcmp(buffer, freezer_state_strs[CGROUP_FROZEN]) == 0) | 342 | else if (strcmp(buffer, freezer_state_strs[CGROUP_FROZEN]) == 0) |
| 332 | goal_state = CGROUP_FROZEN; | 343 | goal_state = CGROUP_FROZEN; |
| 333 | else | 344 | else |
| 334 | return -EIO; | 345 | return -EINVAL; |
| 335 | 346 | ||
| 336 | if (!cgroup_lock_live_group(cgroup)) | 347 | if (!cgroup_lock_live_group(cgroup)) |
| 337 | return -ENODEV; | 348 | return -ENODEV; |
| @@ -350,6 +361,8 @@ static struct cftype files[] = { | |||
| 350 | 361 | ||
| 351 | static int freezer_populate(struct cgroup_subsys *ss, struct cgroup *cgroup) | 362 | static int freezer_populate(struct cgroup_subsys *ss, struct cgroup *cgroup) |
| 352 | { | 363 | { |
| 364 | if (!cgroup->parent) | ||
| 365 | return 0; | ||
| 353 | return cgroup_add_files(cgroup, ss, files, ARRAY_SIZE(files)); | 366 | return cgroup_add_files(cgroup, ss, files, ARRAY_SIZE(files)); |
| 354 | } | 367 | } |
| 355 | 368 | ||
