linux/arch
Eric W. Biederman 6e3fbee5f1 [PATCH] i386/x86-64: Don't IPI to offline cpus on shutdown
So why are we calling smp_send_stop from machine_halt?

We don't.

Looking more closely at the bug report the problem here
is that halt -p is called which triggers not a halt but
an attempt to power off.

machine_power_off calls machine_shutdown which calls smp_send_stop.

If pm_power_off is set we should never make it out machine_power_off
to the call of do_exit.  So pm_power_off must not be set in this case.
When pm_power_off is not set we expect machine_power_off to devolve
into machine_halt.

So how do we fix this?

Playing too much with smp_send_stop is dangerous because it
must also be safe to be called from panic.

It looks like the obviously correct fix is to only call
machine_shutdown when pm_power_off is defined.  Doing
that will make Andi's assumption about not scheduling
true and generally simplify what must be supported.

This turns machine_power_off into a noop like machine_halt
when pm_power_off is not defined.

If the expected behavior is that sys_reboot(LINUX_REBOOT_CMD_POWER_OFF)
becomes sys_reboot(LINUX_REBOOT_CMD_HALT) if pm_power_off is NULL
this is not quite a comprehensive fix as we pass a different parameter
to the reboot notifier and we set system_state to a different value
before calling device_shutdown().

Unfortunately any fix more comprehensive I can think of is not
obviously correct.  The core problem is that there is no architecture
independent way to detect if machine_power will become a noop, without
calling it.

Signed-off-by: Andi Kleen <ak@suse.de>
Signed-off-by: Linus Torvalds <torvalds@osdl.org>
2006-01-11 19:04:50 -08:00
..
alpha [PATCH] capable/capability.h (arch/) 2006-01-11 18:42:14 -08:00
arm [PATCH] capable/capability.h (arch/) 2006-01-11 18:42:14 -08:00
arm26 [PATCH] dump_thread() cleanup 2006-01-10 08:01:25 -08:00
cris [PATCH] capable/capability.h (arch/) 2006-01-11 18:42:14 -08:00
frv Merge ssh://master.kernel.org/pub/scm/linux/kernel/git/sam/kbuild 2006-01-10 08:21:33 -08:00
h8300 [PATCH] h8300: remove MAGIC_ROM_PTR from memory.c 2006-01-10 09:31:26 -08:00
i386 [PATCH] i386/x86-64: Don't IPI to offline cpus on shutdown 2006-01-11 19:04:50 -08:00
ia64 [PATCH] capable/capability.h (arch/) 2006-01-11 18:42:14 -08:00
m32r [PATCH] dump_thread() cleanup 2006-01-10 08:01:25 -08:00
m68k [PATCH] capable/capability.h (arch/) 2006-01-11 18:42:14 -08:00
m68knommu [PATCH] m68knommu: fix ram length of m5208evb board 2006-01-10 09:31:27 -08:00
mips [PATCH] capable/capability.h (arch/) 2006-01-11 18:42:14 -08:00
parisc [PATCH] capable/capability.h (arch/) 2006-01-11 18:42:14 -08:00
powerpc [PATCH] capable/capability.h (arch/) 2006-01-11 18:42:14 -08:00
ppc [PATCH] capable/capability.h (arch/) 2006-01-11 18:42:14 -08:00
s390 [PATCH] capable/capability.h (arch/) 2006-01-11 18:42:14 -08:00
sh [PATCH] dump_thread() cleanup 2006-01-10 08:01:25 -08:00
sh64 [PATCH] dump_thread() cleanup 2006-01-10 08:01:25 -08:00
sparc [PATCH] capable/capability.h (arch/) 2006-01-11 18:42:14 -08:00
sparc64 [PATCH] capable/capability.h (arch/) 2006-01-11 18:42:14 -08:00
um [PATCH] uml: kill an unused variable 2006-01-11 18:42:10 -08:00
v850 [PATCH] dump_thread() cleanup 2006-01-10 08:01:25 -08:00
x86_64 [PATCH] i386/x86-64: Don't IPI to offline cpus on shutdown 2006-01-11 19:04:50 -08:00
xtensa [PATCH] "tiny-make-id16-support-optional" fixes 2006-01-10 08:01:23 -08:00