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 <[EMAIL PROTECTED]> --- 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 [EMAIL PROTECTED] More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/