On 04/12/2013 03:01 PM, Robin Holt wrote: > kernel/sys.c | 17 +++++++++++++++-- > 1 file changed, 15 insertions(+), 2 deletions(-) > > diff --git a/kernel/sys.c b/kernel/sys.c > index 0da73cf..4d1047d 100644 > --- a/kernel/sys.c > +++ b/kernel/sys.c > @@ -357,6 +357,19 @@ int unregister_reboot_notifier(struct notifier_block *nb) > } > EXPORT_SYMBOL(unregister_reboot_notifier); > > +void migrate_to_boot_cpu(void) > +{ > + /* The boot cpu is always logical cpu 0 */ > + int reboot_cpu_id = 0; > + > + /* Make certain the cpu I'm about to reboot on is online */ > + if (!cpu_online(reboot_cpu_id)) > + reboot_cpu_id = smp_processor_id(); > +
If CPU 0 is offline, there is no point in binding, right? [Fenghua (in CC) added the support to offline CPU0 on x86 Intel platforms. So its possible that CPU0 is offline when you try a reboot.] > + /* Make certain I only run on the appropriate processor */ > + set_cpus_allowed_ptr(current, cpumask_of(reboot_cpu_id)); > +} > + > /** > * kernel_restart - reboot the system > * @cmd: pointer to buffer containing command to execute for restart > @@ -368,7 +381,7 @@ EXPORT_SYMBOL(unregister_reboot_notifier); > void kernel_restart(char *cmd) > { > kernel_restart_prepare(cmd); > - disable_nonboot_cpus(); > + migrate_to_boot_cpu(); > syscore_shutdown(); > if (!cmd) > printk(KERN_EMERG "Restarting system.\n"); > @@ -414,7 +427,7 @@ void kernel_power_off(void) > kernel_shutdown_prepare(SYSTEM_POWER_OFF); > if (pm_power_off_prepare) > pm_power_off_prepare(); > - disable_nonboot_cpus(); > + migrate_to_boot_cpu(); Okay, so you are touching poweroff also. Restart was only recently altered by Shawn, so we can assume that his fix was necessary only to his platform. However, for poweroff, I see the commit below in the git log, which added the disable_nonboot_cpus() call. commit 4047727e5ae33f9b8d2b7766d1994ea6e5ec2991 Author: Mark Lord <l...@rtr.ca> Date: Mon Oct 1 01:20:10 2007 -0700 Fix SMP poweroff hangs Its an old commit, so perhaps the issue no longer holds good, but I thought I should bring this to notice, just in case. > syscore_shutdown(); > printk(KERN_EMERG "Power down.\n"); > kmsg_dump(KMSG_DUMP_POWEROFF); > Regards, Srivatsa S. Bhat -- To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to majord...@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/