Skip to content

Commit 686c4cb

Browse files
committed
Merge branch 'pm-fixes' of git://git.kernel.org/pub/scm/linux/kernel/git/rafael/suspend-2.6
* 'pm-fixes' of git://git.kernel.org/pub/scm/linux/kernel/git/rafael/suspend-2.6: PM: Add missing syscore_suspend() and syscore_resume() calls PM: Fix error code paths executed after failing syscore_suspend()
2 parents b07ad99 + 19234c0 commit 686c4cb

File tree

6 files changed

+34
-4
lines changed

6 files changed

+34
-4
lines changed

arch/x86/kernel/apm_32.c

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -228,6 +228,7 @@
228228
#include <linux/kthread.h>
229229
#include <linux/jiffies.h>
230230
#include <linux/acpi.h>
231+
#include <linux/syscore_ops.h>
231232

232233
#include <asm/system.h>
233234
#include <asm/uaccess.h>
@@ -1238,6 +1239,7 @@ static int suspend(int vetoable)
12381239

12391240
local_irq_disable();
12401241
sysdev_suspend(PMSG_SUSPEND);
1242+
syscore_suspend();
12411243

12421244
local_irq_enable();
12431245

@@ -1255,6 +1257,7 @@ static int suspend(int vetoable)
12551257
apm_error("suspend", err);
12561258
err = (err == APM_SUCCESS) ? 0 : -EIO;
12571259

1260+
syscore_resume();
12581261
sysdev_resume();
12591262
local_irq_enable();
12601263

@@ -1280,13 +1283,15 @@ static void standby(void)
12801283

12811284
local_irq_disable();
12821285
sysdev_suspend(PMSG_SUSPEND);
1286+
syscore_suspend();
12831287
local_irq_enable();
12841288

12851289
err = set_system_power_state(APM_STATE_STANDBY);
12861290
if ((err != APM_SUCCESS) && (err != APM_NO_ERROR))
12871291
apm_error("standby", err);
12881292

12891293
local_irq_disable();
1294+
syscore_resume();
12901295
sysdev_resume();
12911296
local_irq_enable();
12921297

drivers/base/syscore.c

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -73,6 +73,7 @@ int syscore_suspend(void)
7373

7474
return ret;
7575
}
76+
EXPORT_SYMBOL_GPL(syscore_suspend);
7677

7778
/**
7879
* syscore_resume - Execute all the registered system core resume callbacks.
@@ -95,6 +96,7 @@ void syscore_resume(void)
9596
"Interrupts enabled after %pF\n", ops->resume);
9697
}
9798
}
99+
EXPORT_SYMBOL_GPL(syscore_resume);
98100
#endif /* CONFIG_PM_SLEEP */
99101

100102
/**

drivers/xen/manage.c

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88
#include <linux/sysrq.h>
99
#include <linux/stop_machine.h>
1010
#include <linux/freezer.h>
11+
#include <linux/syscore_ops.h>
1112

1213
#include <xen/xen.h>
1314
#include <xen/xenbus.h>
@@ -70,8 +71,13 @@ static int xen_suspend(void *data)
7071
BUG_ON(!irqs_disabled());
7172

7273
err = sysdev_suspend(PMSG_FREEZE);
74+
if (!err) {
75+
err = syscore_suspend();
76+
if (err)
77+
sysdev_resume();
78+
}
7379
if (err) {
74-
printk(KERN_ERR "xen_suspend: sysdev_suspend failed: %d\n",
80+
printk(KERN_ERR "xen_suspend: system core suspend failed: %d\n",
7581
err);
7682
return err;
7783
}
@@ -95,6 +101,7 @@ static int xen_suspend(void *data)
95101
xen_timer_resume();
96102
}
97103

104+
syscore_resume();
98105
sysdev_resume();
99106

100107
return 0;

kernel/kexec.c

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,7 @@
3333
#include <linux/vmalloc.h>
3434
#include <linux/swap.h>
3535
#include <linux/kmsg_dump.h>
36+
#include <linux/syscore_ops.h>
3637

3738
#include <asm/page.h>
3839
#include <asm/uaccess.h>
@@ -1532,6 +1533,11 @@ int kernel_kexec(void)
15321533
local_irq_disable();
15331534
/* Suspend system devices */
15341535
error = sysdev_suspend(PMSG_FREEZE);
1536+
if (!error) {
1537+
error = syscore_suspend();
1538+
if (error)
1539+
sysdev_resume();
1540+
}
15351541
if (error)
15361542
goto Enable_irqs;
15371543
} else
@@ -1546,6 +1552,7 @@ int kernel_kexec(void)
15461552

15471553
#ifdef CONFIG_KEXEC_JUMP
15481554
if (kexec_image->preserve_context) {
1555+
syscore_resume();
15491556
sysdev_resume();
15501557
Enable_irqs:
15511558
local_irq_enable();

kernel/power/hibernate.c

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -273,8 +273,11 @@ static int create_image(int platform_mode)
273273
local_irq_disable();
274274

275275
error = sysdev_suspend(PMSG_FREEZE);
276-
if (!error)
276+
if (!error) {
277277
error = syscore_suspend();
278+
if (error)
279+
sysdev_resume();
280+
}
278281
if (error) {
279282
printk(KERN_ERR "PM: Some system devices failed to power down, "
280283
"aborting hibernation\n");
@@ -407,8 +410,11 @@ static int resume_target_kernel(bool platform_mode)
407410
local_irq_disable();
408411

409412
error = sysdev_suspend(PMSG_QUIESCE);
410-
if (!error)
413+
if (!error) {
411414
error = syscore_suspend();
415+
if (error)
416+
sysdev_resume();
417+
}
412418
if (error)
413419
goto Enable_irqs;
414420

kernel/power/suspend.c

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -164,8 +164,11 @@ static int suspend_enter(suspend_state_t state)
164164
BUG_ON(!irqs_disabled());
165165

166166
error = sysdev_suspend(PMSG_SUSPEND);
167-
if (!error)
167+
if (!error) {
168168
error = syscore_suspend();
169+
if (error)
170+
sysdev_resume();
171+
}
169172
if (!error) {
170173
if (!(suspend_test(TEST_CORE) || pm_wakeup_pending())) {
171174
error = suspend_ops->enter(state);

0 commit comments

Comments
 (0)