Skip to content

Commit

Permalink
Merge branch 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel…
Browse files Browse the repository at this point in the history
…/git/rafael/suspend-2.6

* 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/rafael/suspend-2.6:
  PM: Do not hold dpm_list_mtx while disabling/enabling nonboot CPUs
  • Loading branch information
Linus Torvalds committed May 25, 2009
2 parents d5a877e + 32bdfac commit 93c3248
Show file tree
Hide file tree
Showing 4 changed files with 8 additions and 26 deletions.
4 changes: 4 additions & 0 deletions drivers/base/power/main.c
Original file line number Diff line number Diff line change
Expand Up @@ -357,6 +357,7 @@ static void dpm_power_up(pm_message_t state)
{
struct device *dev;

mutex_lock(&dpm_list_mtx);
list_for_each_entry(dev, &dpm_list, power.entry)
if (dev->power.status > DPM_OFF) {
int error;
Expand All @@ -366,6 +367,7 @@ static void dpm_power_up(pm_message_t state)
if (error)
pm_dev_err(dev, state, " early", error);
}
mutex_unlock(&dpm_list_mtx);
}

/**
Expand Down Expand Up @@ -614,6 +616,7 @@ int device_power_down(pm_message_t state)
int error = 0;

suspend_device_irqs();
mutex_lock(&dpm_list_mtx);
list_for_each_entry_reverse(dev, &dpm_list, power.entry) {
error = suspend_device_noirq(dev, state);
if (error) {
Expand All @@ -622,6 +625,7 @@ int device_power_down(pm_message_t state)
}
dev->power.status = DPM_OFF_IRQ;
}
mutex_unlock(&dpm_list_mtx);
if (error)
device_power_up(resume_event(state));
return error;
Expand Down
2 changes: 0 additions & 2 deletions kernel/kexec.c
Original file line number Diff line number Diff line change
Expand Up @@ -1451,7 +1451,6 @@ int kernel_kexec(void)
error = device_suspend(PMSG_FREEZE);
if (error)
goto Resume_console;
device_pm_lock();
/* At this point, device_suspend() has been called,
* but *not* device_power_down(). We *must*
* device_power_down() now. Otherwise, drivers for
Expand Down Expand Up @@ -1489,7 +1488,6 @@ int kernel_kexec(void)
enable_nonboot_cpus();
device_power_up(PMSG_RESTORE);
Resume_devices:
device_pm_unlock();
device_resume(PMSG_RESTORE);
Resume_console:
resume_console();
Expand Down
21 changes: 3 additions & 18 deletions kernel/power/disk.c
Original file line number Diff line number Diff line change
Expand Up @@ -215,8 +215,6 @@ static int create_image(int platform_mode)
if (error)
return error;

device_pm_lock();

/* At this point, device_suspend() has been called, but *not*
* device_power_down(). We *must* call device_power_down() now.
* Otherwise, drivers for some devices (e.g. interrupt controllers)
Expand All @@ -227,7 +225,7 @@ static int create_image(int platform_mode)
if (error) {
printk(KERN_ERR "PM: Some devices failed to power down, "
"aborting hibernation\n");
goto Unlock;
return error;
}

error = platform_pre_snapshot(platform_mode);
Expand Down Expand Up @@ -280,9 +278,6 @@ static int create_image(int platform_mode)
device_power_up(in_suspend ?
(error ? PMSG_RECOVER : PMSG_THAW) : PMSG_RESTORE);

Unlock:
device_pm_unlock();

return error;
}

Expand Down Expand Up @@ -344,13 +339,11 @@ static int resume_target_kernel(bool platform_mode)
{
int error;

device_pm_lock();

error = device_power_down(PMSG_QUIESCE);
if (error) {
printk(KERN_ERR "PM: Some devices failed to power down, "
"aborting resume\n");
goto Unlock;
return error;
}

error = platform_pre_restore(platform_mode);
Expand Down Expand Up @@ -403,9 +396,6 @@ static int resume_target_kernel(bool platform_mode)

device_power_up(PMSG_RECOVER);

Unlock:
device_pm_unlock();

return error;
}

Expand Down Expand Up @@ -464,11 +454,9 @@ int hibernation_platform_enter(void)
goto Resume_devices;
}

device_pm_lock();

error = device_power_down(PMSG_HIBERNATE);
if (error)
goto Unlock;
goto Resume_devices;

error = hibernation_ops->prepare();
if (error)
Expand All @@ -493,9 +481,6 @@ int hibernation_platform_enter(void)

device_power_up(PMSG_RESTORE);

Unlock:
device_pm_unlock();

Resume_devices:
entering_platform_hibernation = false;
device_resume(PMSG_RESTORE);
Expand Down
7 changes: 1 addition & 6 deletions kernel/power/main.c
Original file line number Diff line number Diff line change
Expand Up @@ -289,12 +289,10 @@ static int suspend_enter(suspend_state_t state)
{
int error;

device_pm_lock();

if (suspend_ops->prepare) {
error = suspend_ops->prepare();
if (error)
goto Done;
return error;
}

error = device_power_down(PMSG_SUSPEND);
Expand Down Expand Up @@ -343,9 +341,6 @@ static int suspend_enter(suspend_state_t state)
if (suspend_ops->finish)
suspend_ops->finish();

Done:
device_pm_unlock();

return error;
}

Expand Down

0 comments on commit 93c3248

Please sign in to comment.