[RFC PATCH 1/2] Fix PF_NOFREEZE and freezeable race

Gautham R Shenoy
2007-04-19T12:04:00Z

This patch fixes the race pointed out by Oleg Nesterov.

* Freezer marks a thread as freezeable.
* The thread now marks itself PF_NOFREEZE causing it to
freeze on calling try_to_freeze(). Thus the task is frozen, even though
it doesn't want to.
* Subsequent thaw_processes() will also fail to thaw the task since it is
marked PF_NOFREEZE.

Avoid this problem by checking the current task's PF_NOFREEZE status in the
refrigerator before marking current as frozen.

Signed-off-by: Gautham R Shenoy <ego@in.ibm.com>
---
kernel/power/process.c | 9 +++++++++
1 file changed, 9 insertions(+)

Index: linux-2.6.21-rc6/kernel/power/process.c
===================================================================
--- linux-2.6.21-rc6.orig/kernel/power/process.c
+++ linux-2.6.21-rc6/kernel/power/process.c
@@ -41,6 +41,15 @@ void refrigerator(void)

task_lock(current);
if (freezing(current)) {
+ /* check if we had marked ourself PF_NOFREEZE
+ * *after* the freezer did the freezeable() check
+ * on us.
+ */
+ if (current->flags & PF_NOFREEZE) {
+ clear_tsk_thread_flag(current, TIF_FREEZE);
+ task_unlock(current);
+ return;
+ }
frozen_process(current);
task_unlock(current);
} else {
--
Gautham R Shenoy
Linux Technology Center
IBM India.
"Freedom comes with a price tag of responsibility, which is still a bargain,
because Freedom is priceless!"