Commit 6161b2ce authored by Pavel Machek's avatar Pavel Machek Committed by Linus Torvalds

[PATCH] pm: fix process freezing

If process freezing fails, some processes are frozen, and rest are left in
"were asked to be frozen" state.  Thats wrong, we should leave it in some
consistent state.
Signed-off-by: default avatarPavel Machek <pavel@suse.cz>
Signed-off-by: default avatarAndrew Morton <akpm@osdl.org>
Signed-off-by: default avatarLinus Torvalds <torvalds@osdl.org>
parent 99dc7d63
...@@ -81,13 +81,33 @@ int freeze_processes(void) ...@@ -81,13 +81,33 @@ int freeze_processes(void)
} while_each_thread(g, p); } while_each_thread(g, p);
read_unlock(&tasklist_lock); read_unlock(&tasklist_lock);
yield(); /* Yield is okay here */ yield(); /* Yield is okay here */
if (time_after(jiffies, start_time + TIMEOUT)) { if (todo && time_after(jiffies, start_time + TIMEOUT)) {
printk( "\n" ); printk( "\n" );
printk(KERN_ERR " stopping tasks failed (%d tasks remaining)\n", todo ); printk(KERN_ERR " stopping tasks failed (%d tasks remaining)\n", todo );
return todo; break;
} }
} while(todo); } while(todo);
/* This does not unfreeze processes that are already frozen
* (we have slightly ugly calling convention in that respect,
* and caller must call thaw_processes() if something fails),
* but it cleans up leftover PF_FREEZE requests.
*/
if (todo) {
read_lock(&tasklist_lock);
do_each_thread(g, p)
if (freezing(p)) {
pr_debug(" clean up: %s\n", p->comm);
p->flags &= ~PF_FREEZE;
spin_lock_irqsave(&p->sighand->siglock, flags);
recalc_sigpending_tsk(p);
spin_unlock_irqrestore(&p->sighand->siglock, flags);
}
while_each_thread(g, p);
read_unlock(&tasklist_lock);
return todo;
}
printk( "|\n" ); printk( "|\n" );
BUG_ON(in_atomic()); BUG_ON(in_atomic());
return 0; return 0;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment