Skip to content

Commit

Permalink
---
Browse files Browse the repository at this point in the history
yaml
---
r: 56862
b: refs/heads/master
c: 33e1c28
h: refs/heads/master
v: v3
  • Loading branch information
Rafael J. Wysocki authored and Linus Torvalds committed May 24, 2007
1 parent b0d1450 commit 2208b4a
Show file tree
Hide file tree
Showing 3 changed files with 22 additions and 2 deletions.
2 changes: 1 addition & 1 deletion [refs]
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
---
refs/heads/master: 585a2858b970cb6e2e5ca4877eefd18b4dba8ed4
refs/heads/master: 33e1c288da62a6a5aa9077a6b7bfa690b1b02cf4
10 changes: 10 additions & 0 deletions trunk/include/linux/freezer.h
Original file line number Diff line number Diff line change
Expand Up @@ -37,14 +37,24 @@ static inline void do_not_freeze(struct task_struct *p)

/*
* Wake up a frozen process
*
* task_lock() is taken to prevent the race with refrigerator() which may
* occur if the freezing of tasks fails. Namely, without the lock, if the
* freezing of tasks failed, thaw_tasks() might have run before a task in
* refrigerator() could call frozen_process(), in which case the task would be
* frozen and no one would thaw it.
*/
static inline int thaw_process(struct task_struct *p)
{
task_lock(p);
if (frozen(p)) {
p->flags &= ~PF_FROZEN;
task_unlock(p);
wake_up_process(p);
return 1;
}
clear_tsk_thread_flag(p, TIF_FREEZE);
task_unlock(p);
return 0;
}

Expand Down
12 changes: 11 additions & 1 deletion trunk/kernel/power/process.c
Original file line number Diff line number Diff line change
Expand Up @@ -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(&current->sighand->siglock);
recalc_sigpending(); /* We sent fake signal, clean it up */
spin_unlock_irq(&current->sighand->siglock);
Expand Down Expand Up @@ -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);
}
Expand Down

0 comments on commit 2208b4a

Please sign in to comment.