Patchwork [3.5.y.z,extended,stable] Patch "PM / reboot: call syscore_shutdown() after" has been added to staging queue

mail settings
Submitter Luis Henriques
Date April 15, 2013, 10:59 a.m.
Message ID <>
Download mbox | patch
Permalink /patch/236561/
State New
Headers show


Luis Henriques - April 15, 2013, 10:59 a.m.
This is a note to let you know that I have just added a patch titled

    PM / reboot: call syscore_shutdown() after

to the linux-3.5.y-queue branch of the 3.5.y.z extended stable tree 
which can be found at:;a=shortlog;h=refs/heads/linux-3.5.y-queue

If you, or anyone else, feels it should not be added to this tree, please 
reply to this email.

For more information about the 3.5.y.z tree, see



From af73ffee3fe338df469c6a8c130ebec80fe69952 Mon Sep 17 00:00:00 2001
From: Huacai Chen <>
Date: Sun, 7 Apr 2013 02:14:14 +0000
Subject: [PATCH] PM / reboot: call syscore_shutdown() after

commit 6f389a8f1dd22a24f3d9afc2812b30d639e94625 upstream.

As commit 40dc166c (PM / Core: Introduce struct syscore_ops for core
subsystems PM) say, syscore_ops operations should be carried with one
CPU on-line and interrupts disabled. However, after commit f96972f2d
(kernel/sys.c: call disable_nonboot_cpus() in kernel_restart()),
syscore_shutdown() is called before disable_nonboot_cpus(), so break
the rules. We have a MIPS machine with a 8259A PIC, and there is an
external timer (HPET) linked at 8259A. Since 8259A has been shutdown
too early (by syscore_shutdown()), disable_nonboot_cpus() runs without
timer interrupt, so it hangs and reboot fails. This patch call
syscore_shutdown() a little later (after disable_nonboot_cpus()) to
avoid reboot failure, this is the same way as poweroff does.

For consistency, add disable_nonboot_cpus() to kernel_halt().

Signed-off-by: Huacai Chen <>
Signed-off-by: Rafael J. Wysocki <>
Signed-off-by: Luis Henriques <>
 kernel/sys.c | 3 ++-
 1 file changed, 2 insertions(+), 1 deletion(-)



diff --git a/kernel/sys.c b/kernel/sys.c
index b6fe559..0836a7f 100644
--- a/kernel/sys.c
+++ b/kernel/sys.c
@@ -323,7 +323,6 @@  void kernel_restart_prepare(char *cmd)
 	system_state = SYSTEM_RESTART;
-	syscore_shutdown();

@@ -369,6 +368,7 @@  void kernel_restart(char *cmd)
+	syscore_shutdown();
 	if (!cmd)
 		printk(KERN_EMERG "Restarting system.\n");
@@ -394,6 +394,7 @@  static void kernel_shutdown_prepare(enum system_states state)
 void kernel_halt(void)
+	disable_nonboot_cpus();
 	printk(KERN_EMERG "System halted.\n");