]> git.karo-electronics.de Git - karo-tx-linux.git/commit
freezer: restructure __refrigerator()
authorTejun Heo <tj@kernel.org>
Thu, 3 Nov 2011 22:19:28 +0000 (15:19 -0700)
committerTejun Heo <tj@kernel.org>
Thu, 3 Nov 2011 22:19:28 +0000 (15:19 -0700)
commit913695ee050938dd85465cf22052861d3da385e1
tree4d8fcad07a591b83a40f9f2bbeb3a0ce89556fe0
parent5f005e299f00e034a6f0d8d30ab43a272a0a5cbc
freezer: restructure __refrigerator()

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().

Oleg suggested restructuring __refrigerator() such that there's single
condition check section inside freezer_lock and sigpending is cleared
afterwards, which fixes the problem and simplifies the code.
Restructure accordingly.

-v2: Frozen loop exited without releasing freezer_lock.  Fixed.

Signed-off-by: Tejun Heo <tj@kernel.org>
Reported-by: Oleg Nesterov <oleg@redhat.com>
Acked-by: Oleg Nesterov <oleg@redhat.com>
Cc: "Rafael J. Wysocki" <rjw@sisk.pl>
kernel/freezer.c