[<prev] [next>] [<thread-prev] [thread-next>] [day] [month] [year] [list]
Message-ID: <20110829140549.GD18871@mtj.dyndns.org>
Date: Mon, 29 Aug 2011 16:05:49 +0200
From: Tejun Heo <tj@...nel.org>
To: "Rafael J. Wysocki" <rjw@...k.pl>, Oleg Nesterov <oleg@...hat.com>,
Paul Menage <paul@...lmenage.org>
Cc: containers@...ts.linux-foundation.org,
linux-pm@...ts.linux-foundation.org, linux-kernel@...r.kernel.org
Subject: [PATCH pm-freezer 3/4] freezer: check freezing() before leaving
FROZEN state
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@...nel.org>
Reported-by: Oleg Nesterov <oleg@...hat.com>
Cc: "Rafael J. Wysocki" <rjw@...k.pl>
---
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);
--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@...r.kernel.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/
Powered by blists - more mailing lists