If another freeze happens before all tasks leave FROZEN state after being thawed, the freezer can see the existing FROZEN and consider the tasks to be frozen but they can clear FROZEN without checking the new freezing(). Check freezing() while holding freezer_lock before clearing FROZEN. Signed-off-by: Tejun Heo <tj@xxxxxxxxxx> Reported-by: Oleg Nesterov <oleg@xxxxxxxxxx> Cc: "Rafael J. Wysocki" <rjw@xxxxxxx> --- kernel/freezer.c | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) Index: work/kernel/freezer.c =================================================================== --- work.orig/kernel/freezer.c +++ work/kernel/freezer.c @@ -60,6 +60,7 @@ bool __refrigerator(bool check_kthr_stop */ spin_lock_irq(&freezer_lock); current->flags |= PF_FROZEN; +refreeze: spin_unlock_irq(&freezer_lock); save = current->state; @@ -78,8 +79,10 @@ bool __refrigerator(bool check_kthr_stop schedule(); } - /* leave FROZEN */ + /* leave FROZEN after checking freezing() holding freezer_lock */ spin_lock_irq(&freezer_lock); + if (freezing(current)) + goto refreeze; current->flags &= ~PF_FROZEN; spin_unlock_irq(&freezer_lock); _______________________________________________ linux-pm mailing list linux-pm@xxxxxxxxxxxxxxxxxxxxxxxxxx https://lists.linux-foundation.org/mailman/listinfo/linux-pm