Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit a585042f authored by Tejun Heo's avatar Tejun Heo
Browse files

freezer: remove racy clear_freeze_flag() and set PF_NOFREEZE on dead tasks



clear_freeze_flag() in exit_mm() is racy.  Freezing can start
afterwards.  Remove it.  Skipping freezer for exiting task will be
properly implemented later.

Also, freezable() was testing exit_state directly to make system
freezer ignore dead tasks.  Let the exiting task set PF_NOFREEZE after
entering TASK_DEAD instead.

Signed-off-by: default avatarTejun Heo <tj@kernel.org>
Cc: Oleg Nesterov <oleg@redhat.com>
parent a5be2d0d
Loading
Loading
Loading
Loading
+1 −2
Original line number Diff line number Diff line
@@ -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);
	task_unlock(tsk);
	mm_update_next_owner(mm);
	mmput(mm);
@@ -1040,6 +1038,7 @@ NORET_TYPE void do_exit(long code)
	exit_rcu();
	/* causes final put_task_struct in finish_task_switch(). */
	tsk->state = TASK_DEAD;
	tsk->flags |= PF_NOFREEZE;	/* tell freezer to ignore us */
	schedule();
	BUG();
	/* Avoid "noreturn function does return".  */
+1 −2
Original line number Diff line number Diff line
@@ -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;
}