Skip to content

Commit

Permalink
---
Browse files Browse the repository at this point in the history
yaml
---
r: 280373
b: refs/heads/master
c: 03afed8
h: refs/heads/master
i:
  280371: 435d5a5
v: v3
  • Loading branch information
Tejun Heo committed Nov 21, 2011
1 parent ac1843e commit 5a3f1cd
Show file tree
Hide file tree
Showing 7 changed files with 24 additions and 47 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: 376fede80e74d98b49d1ba9ac18f23c9fd026ddd
refs/heads/master: 03afed8bc296fa70186ba832c1126228bb992465
1 change: 0 additions & 1 deletion trunk/include/linux/freezer.h
Original file line number Diff line number Diff line change
Expand Up @@ -61,7 +61,6 @@ static inline bool try_to_freeze(void)
}

extern bool freeze_task(struct task_struct *p, bool sig_only);
extern void cancel_freezing(struct task_struct *p);

#ifdef CONFIG_CGROUP_FREEZER
extern int cgroup_freezing_or_frozen(struct task_struct *task);
Expand Down
25 changes: 9 additions & 16 deletions trunk/kernel/freezer.c
Original file line number Diff line number Diff line change
Expand Up @@ -129,21 +129,6 @@ bool freeze_task(struct task_struct *p, bool sig_only)
return ret;
}

void cancel_freezing(struct task_struct *p)
{
unsigned long flags;

spin_lock_irqsave(&freezer_lock, flags);
if (freezing(p)) {
pr_debug(" clean up: %s\n", p->comm);
clear_freeze_flag(p);
spin_lock(&p->sighand->siglock);
recalc_sigpending_and_wake(p);
spin_unlock(&p->sighand->siglock);
}
spin_unlock_irqrestore(&freezer_lock, flags);
}

void __thaw_task(struct task_struct *p)
{
unsigned long flags;
Expand All @@ -153,10 +138,18 @@ void __thaw_task(struct task_struct *p)
* be visible to @p as waking up implies wmb. Waking up inside
* freezer_lock also prevents wakeups from leaking outside
* refrigerator.
*
* If !FROZEN, @p hasn't reached refrigerator, recalc sigpending to
* avoid leaving dangling TIF_SIGPENDING behind.
*/
spin_lock_irqsave(&freezer_lock, flags);
clear_freeze_flag(p);
if (frozen(p))
if (frozen(p)) {
wake_up_process(p);
} else {
spin_lock(&p->sighand->siglock);
recalc_sigpending_and_wake(p);
spin_unlock(&p->sighand->siglock);
}
spin_unlock_irqrestore(&freezer_lock, flags);
}
15 changes: 2 additions & 13 deletions trunk/kernel/power/hibernate.c
Original file line number Diff line number Diff line change
Expand Up @@ -607,17 +607,6 @@ static void power_down(void)
while(1);
}

static int prepare_processes(void)
{
int error = 0;

if (freeze_processes()) {
error = -EBUSY;
thaw_processes();
}
return error;
}

/**
* hibernate - Carry out system hibernation, including saving the image.
*/
Expand Down Expand Up @@ -650,7 +639,7 @@ int hibernate(void)
sys_sync();
printk("done.\n");

error = prepare_processes();
error = freeze_processes();
if (error)
goto Finish;

Expand Down Expand Up @@ -811,7 +800,7 @@ static int software_resume(void)
goto close_finish;

pr_debug("PM: Preparing processes for restore.\n");
error = prepare_processes();
error = freeze_processes();
if (error) {
swsusp_close(FMODE_READ);
goto Done;
Expand Down
16 changes: 8 additions & 8 deletions trunk/kernel/power/process.c
Original file line number Diff line number Diff line change
Expand Up @@ -91,26 +91,18 @@ static int try_to_freeze_tasks(bool sig_only)
elapsed_csecs = elapsed_csecs64;

if (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.
*/
printk("\n");
printk(KERN_ERR "Freezing of tasks %s after %d.%02d seconds "
"(%d tasks refusing to freeze, wq_busy=%d):\n",
wakeup ? "aborted" : "failed",
elapsed_csecs / 100, elapsed_csecs % 100,
todo - wq_busy, wq_busy);

thaw_workqueues();

read_lock(&tasklist_lock);
do_each_thread(g, p) {
if (!wakeup && !freezer_should_skip(p) &&
freezing(p) && !frozen(p))
sched_show_task(p);
cancel_freezing(p);
} while_each_thread(g, p);
read_unlock(&tasklist_lock);
} else {
Expand All @@ -123,6 +115,8 @@ static int try_to_freeze_tasks(bool sig_only)

/**
* freeze_processes - Signal user space processes to enter the refrigerator.
*
* On success, returns 0. On failure, -errno and system is fully thawed.
*/
int freeze_processes(void)
{
Expand All @@ -137,11 +131,15 @@ int freeze_processes(void)
printk("\n");
BUG_ON(in_atomic());

if (error)
thaw_processes();
return error;
}

/**
* freeze_kernel_threads - Make freezable kernel threads go to the refrigerator.
*
* On success, returns 0. On failure, -errno and system is fully thawed.
*/
int freeze_kernel_threads(void)
{
Expand All @@ -155,6 +153,8 @@ int freeze_kernel_threads(void)
printk("\n");
BUG_ON(in_atomic());

if (error)
thaw_processes();
return error;
}

Expand Down
8 changes: 3 additions & 5 deletions trunk/kernel/power/suspend.c
Original file line number Diff line number Diff line change
Expand Up @@ -106,13 +106,11 @@ static int suspend_prepare(void)
goto Finish;

error = suspend_freeze_processes();
if (error) {
suspend_stats.failed_freeze++;
dpm_save_failed_step(SUSPEND_FREEZE);
} else
if (!error)
return 0;

suspend_thaw_processes();
suspend_stats.failed_freeze++;
dpm_save_failed_step(SUSPEND_FREEZE);
usermodehelper_enable();
Finish:
pm_notifier_call_chain(PM_POST_SUSPEND);
Expand Down
4 changes: 1 addition & 3 deletions trunk/kernel/power/user.c
Original file line number Diff line number Diff line change
Expand Up @@ -257,10 +257,8 @@ static long snapshot_ioctl(struct file *filp, unsigned int cmd,
break;

error = freeze_processes();
if (error) {
thaw_processes();
if (error)
usermodehelper_enable();
}
if (!error)
data->frozen = 1;
break;
Expand Down

0 comments on commit 5a3f1cd

Please sign in to comment.