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

From: Gautham R Shenoy
Date: Thu Apr 19 2007 - 08:04:24 EST


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@xxxxxxxxxx>
---
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!"
-
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/