|
@@ -37,10 +37,18 @@ void refrigerator(void)
|
|
|
/* Hmm, should we be allowed to suspend when there are realtime
|
|
|
processes around? */
|
|
|
long save;
|
|
|
+
|
|
|
+ task_lock(current);
|
|
|
+ if (freezing(current)) {
|
|
|
+ frozen_process(current);
|
|
|
+ task_unlock(current);
|
|
|
+ } else {
|
|
|
+ task_unlock(current);
|
|
|
+ return;
|
|
|
+ }
|
|
|
save = current->state;
|
|
|
pr_debug("%s entered refrigerator\n", current->comm);
|
|
|
|
|
|
- frozen_process(current);
|
|
|
spin_lock_irq(¤t->sighand->siglock);
|
|
|
recalc_sigpending(); /* We sent fake signal, clean it up */
|
|
|
spin_unlock_irq(¤t->sighand->siglock);
|
|
@@ -152,10 +160,12 @@ static unsigned int try_to_freeze_tasks(int freeze_user_space)
|
|
|
if (is_user_space(p) == !freeze_user_space)
|
|
|
continue;
|
|
|
|
|
|
+ task_lock(p);
|
|
|
if (freezeable(p) && !frozen(p))
|
|
|
printk(KERN_ERR " %s\n", p->comm);
|
|
|
|
|
|
cancel_freezing(p);
|
|
|
+ task_unlock(p);
|
|
|
} while_each_thread(g, p);
|
|
|
read_unlock(&tasklist_lock);
|
|
|
}
|