]> git.karo-electronics.de Git - karo-tx-linux.git/commitdiff
freezer: make exiting tasks properly unfreezable
authorTejun Heo <tj@kernel.org>
Sat, 20 Aug 2011 09:31:39 +0000 (11:31 +0200)
committerTejun Heo <tj@kernel.org>
Sat, 20 Aug 2011 09:31:39 +0000 (11:31 +0200)
There's no point in freezing an exiting task.  The current code
seemingly tries that by calling clear_freeze_flag() from exit_mm() but
it's racy as freeze might happen afterwards.

This patch removes the racy clear_freeze_flag() makes do_exit() set
PF_NOFREEZE after PTRACE_EVENT_EXIT, after which freezing doesn't make
sense.

Signed-off-by: Tejun Heo <tj@kernel.org>
kernel/exit.c
kernel/power/process.c

index 2913b3509d4288026990cc087894e69eace6c564..ac58259a9f8a224ebe4800b195062db65e4b85a4 100644 (file)
@@ -679,8 +679,6 @@ static void exit_mm(struct task_struct * tsk)
        tsk->mm = NULL;
        up_read(&mm->mmap_sem);
        enter_lazy_tlb(mm, current);
-       /* We don't want this task to be frozen prematurely */
-       clear_freeze_flag(tsk);
        if (tsk->signal->oom_score_adj == OOM_SCORE_ADJ_MIN)
                atomic_dec(&mm->oom_disable_count);
        task_unlock(tsk);
@@ -915,6 +913,12 @@ NORET_TYPE void do_exit(long code)
 
        ptrace_event(PTRACE_EVENT_EXIT, code);
 
+       /*
+        * With ptrace notification done, there's no point in freezing from
+        * here on.  Disallow freezing.
+        */
+       current->flags |= PF_NOFREEZE;
+
        validate_creds_for_do_exit(tsk);
 
        /*
index bec09c392d81ba7e01a68d49f008fc7fcd3825ed..ddfaba4da2b16c2b812b821717aba611dc5d08b0 100644 (file)
@@ -25,8 +25,7 @@
 static inline int freezable(struct task_struct * p)
 {
        if ((p == current) ||
-           (p->flags & PF_NOFREEZE) ||
-           (p->exit_state != 0))
+           (p->flags & PF_NOFREEZE))
                return 0;
        return 1;
 }