diff options
author | Li Zefan <lizf@cn.fujitsu.com> | 2008-10-29 14:00:51 -0700 |
---|---|---|
committer | Linus Torvalds <torvalds@linux-foundation.org> | 2008-10-30 11:38:45 -0700 |
commit | 7ccb97437bcc818d0ba6067513475f6ee8177a15 (patch) | |
tree | 5d9209002ea50383ffc256f89c25743552b5c637 | |
parent | df8bc08c192f00f155185bfd6f052d46a728814a (diff) | |
download | linux-7ccb97437bcc818d0ba6067513475f6ee8177a15.tar.gz linux-7ccb97437bcc818d0ba6067513475f6ee8177a15.tar.bz2 linux-7ccb97437bcc818d0ba6067513475f6ee8177a15.zip |
freezer_cg: fix improper BUG_ON() causing oops
The BUG_ON() should be protected by freezer->lock, otherwise it can be
triggered easily when a task has been unfreezed but the corresponding
cgroup hasn't been changed to FROZEN state.
Signed-off-by: Li Zefan <lizf@cn.fujitsu.com>
Acked-by: Cedric Le Goater <clg@fr.ibm.com>
Acked-by: Matt Helsley <matthltc@us.ibm.com>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
-rw-r--r-- | kernel/cgroup_freezer.c | 3 |
1 files changed, 2 insertions, 1 deletions
diff --git a/kernel/cgroup_freezer.c b/kernel/cgroup_freezer.c index e95056954498..7f54d1c42953 100644 --- a/kernel/cgroup_freezer.c +++ b/kernel/cgroup_freezer.c @@ -190,8 +190,9 @@ static void freezer_fork(struct cgroup_subsys *ss, struct task_struct *task) freezer = task_freezer(task); task_unlock(task); - BUG_ON(freezer->state == CGROUP_FROZEN); spin_lock_irq(&freezer->lock); + BUG_ON(freezer->state == CGROUP_FROZEN); + /* Locking avoids race with FREEZING -> THAWED transitions. */ if (freezer->state == CGROUP_FREEZING) freeze_task(task, true); |