linux/arch/powerpc/kernel
Nathan Lynch 8f5c7579ca [POWERPC] Fix multiple bugs in rtas_ibm_suspend_me code
There are several issues with the rtas_ibm_suspend_me code, which
enables platform-assisted suspension of an LPAR as covered in PAPR
2.2.

1.) rtas_ibm_suspend_me uses on_each_cpu() to invoke
rtas_percpu_suspend_me on all cpus via IPI:

if (on_each_cpu(rtas_percpu_suspend_me, &data, 1, 0))
...

'data' is on the calling task's stack, but rtas_ibm_suspend_me takes
no measures to ensure that all instances of rtas_percpu_suspend_me are
finished accessing 'data' before returning.  This can result in the
IPI'd cpus accessing random stack data and getting stuck in H_JOIN.

This is addressed by using an atomic count of workers and a completion
on the stack.

2.) rtas_percpu_suspend_me is needlessly calling H_JOIN in a loop.
The only event that can cause a cpu to return from H_JOIN is an H_PROD
from another cpu or a NMI/system reset.  Each cpu need call H_JOIN
only once per suspend operation.

Remove the loop and the now unnecessary 'waiting' state variable.

3.) H_JOIN must be called with MSR[EE] off, but lazy interrupt
disabling may cause the caller of rtas_ibm_suspend_me to call H_JOIN
with it on; the local_irq_disable() in on_each_cpu() is not
sufficient.

Fix this by explicitly saving the MSR and clearing the EE bit before
calling H_JOIN.

4.) H_PROD is being called with the Linux logical cpu number as the
parameter, not the platform interrupt server value.  (It's also being
called for all possible cpus, which is harmless, but unnecessary.)

This is fixed by calling H_PROD for each online cpu using
get_hard_smp_processor_id(cpu) for the argument.

Signed-off-by: Nathan Lynch <ntl@pobox.com>
Signed-off-by: Paul Mackerras <paulus@samba.org>
2007-11-19 15:11:30 +11:00
..
vdso32 powerpc32 vDSO: linker script indentation 2007-10-16 10:01:50 -07:00
vdso64 [POWERPC] Fix 64 bits vDSO DWARF info for CR register 2007-10-17 22:30:09 +10:00
align.c [POWERPC] Handle alignment faults on SPE load/store instructions 2007-09-14 08:51:48 -05:00
asm-offsets.c powerpc: add scaled time accounting 2007-10-18 14:37:28 -07:00
audit.c [PATCH] audit signal recipients 2007-05-11 05:38:25 -04:00
binfmt_elf32.c powerpc: Use linux/elfcore-compat.h 2007-10-17 08:42:51 -07:00
btext.c [POWERPC] Fix early btext debug on PowerMac 2007-11-13 16:22:44 +11:00
clock.c [POWERPC] clk.h interface for platforms 2007-10-03 09:11:56 +10:00
compat_audit.c [PATCH] add SIGNAL syscall class (v3) 2007-05-11 05:38:25 -04:00
cpu_setup_6xx.S Spelling fix: explicitly 2007-10-19 23:22:55 +02:00
cpu_setup_44x.S [POWERPC] 4xx: 440EPx/GRx incorrect write to DDR SDRAM errata workaround 2007-10-03 07:20:18 -05:00
cpu_setup_pa6t.S [POWERPC] pasemi: Enable one more hid bit 2007-04-24 21:31:49 +10:00
cpu_setup_ppc970.S [POWERPC] powerpc: Enable DEEPNAP power savings mode on 970MP 2006-10-16 16:32:25 +10:00
cputable.c [POWERPC] 4xx: Workaround for the 440EP(x)/GR(x) processors identical PVR issue. 2007-11-01 07:13:43 -05:00
crash.c [POWERPC] Clean out a bunch of duplicate includes 2007-08-17 11:01:51 +10:00
crash_dump.c [POWERPC] FWNMI is only used on pSeries 2007-09-19 15:25:34 +10:00
dma_64.c Update arch/ to use sg helpers 2007-10-22 21:19:59 +02:00
entry_32.S [POWERPC] Avoid unpaired stwcx. on some processors 2007-11-13 16:22:43 +11:00
entry_64.S [POWERPC] Add 1TB workaround for PA6T 2007-10-17 22:30:09 +10:00
firmware.c
fpu.S
head_8xx.S [POWERPC] 8xx: Work around CPU15 erratum. 2007-10-03 20:36:36 -05:00
head_32.S [POWERPC] Use PAGE_OFFSET to tell if an address is user/kernel in SW TLB handlers 2007-10-11 13:36:52 -05:00
head_40x.S [POWERPC] Use PAGE_OFFSET to tell if an address is user/kernel in SW TLB handlers 2007-10-11 13:36:52 -05:00
head_44x.S [POWERPC] Use PAGE_OFFSET to tell if an address is user/kernel in SW TLB handlers 2007-10-11 13:36:52 -05:00
head_64.S [POWERPC] Fix si_addr value on low level hash failures 2007-11-08 14:15:34 +11:00
head_booke.h
head_fsl_booke.S [POWERPC] Use PAGE_OFFSET to tell if an address is user/kernel in SW TLB handlers 2007-10-11 13:36:52 -05:00
ibmebus.c Update arch/ to use sg helpers 2007-10-22 21:19:59 +02:00
idle.c [POWERPC] Fix sysctl table check failure on PowerMac 2007-11-08 14:15:30 +11:00
idle_6xx.S
idle_power4.S [POWERPC] powermac: Support G5 CPU hotplug 2007-05-07 20:31:13 +10:00
init_task.c
io.c [POWERPC] Move inline asm eieio to using eieio inline function 2007-07-10 00:33:14 -05:00
iomap.c [POWERPC] Add 64-bit resources support to pci_iomap 2007-09-20 07:36:52 -05:00
iommu.c Update arch/ to use sg helpers 2007-10-22 21:19:59 +02:00
irq.c Spelling fix: explicitly 2007-10-19 23:22:55 +02:00
isa-bridge.c [POWERPC] Rewrite IO allocation & mapping on powerpc64 2007-06-14 22:29:56 +10:00
kprobes.c kprobes: support kretprobe blacklist 2007-10-16 09:43:10 -07:00
l2cr_6xx.S Convert files to UTF-8 and some cleanups 2007-10-19 23:21:04 +02:00
legacy_serial.c [POWERPC] Add legacy serial support for OPB with flattened device tree 2007-10-12 14:05:18 +10:00
lparcfg.c [POWERPC] ppc64: support CONFIG_DEBUG_PREEMPT 2007-10-03 11:48:44 +10:00
machine_kexec.c Use extended crashkernel command line on ppc64 2007-10-19 11:53:51 -07:00
machine_kexec_32.c
machine_kexec_64.c [POWERPC] Rename get_property to of_get_property: arch/powerpc 2007-04-13 03:55:19 +10:00
Makefile [POWERPC] 8xx: Move softemu8xx.c from arch/ppc 2007-10-04 11:02:54 -05:00
misc.S
misc_32.S [POWERPC] 4xx: Deal with 44x virtually tagged icache 2007-11-01 07:15:30 -05:00
misc_64.S [POWERPC] kexec: Send slaves to new kernel earlier 2007-06-25 16:55:16 +10:00
module_32.c [POWERPC] Add support for R_PPC_ADDR16_HI relocations 2007-01-24 21:13:58 +11:00
module_64.c [POWERPC] Generic BUG for powerpc 2006-12-11 16:35:07 +11:00
msi.c [POWERPC] PowerPC MSI infrastructure 2007-05-08 13:40:31 +10:00
nvram_64.c [POWERPC] pseries: Eliminate global error_log_cnt variable 2007-08-17 11:01:52 +10:00
of_device.c [POWERPC] Move of_device allocation into of_device.[ch] 2007-10-17 22:30:07 +10:00
of_platform.c [POWERPC] Move of_device allocation into of_device.[ch] 2007-10-17 22:30:07 +10:00
paca.c
pci-common.c [POWERPC] Use alloc_maybe_bootmem() in pcibios_alloc_controller 2007-10-03 15:31:35 +10:00
pci_32.c [POWERPC] null_pci_ops: Use named structure member initializers 2007-08-17 11:01:53 +10:00
pci_64.c [POWERPC] Fix pci domain detection 2007-10-03 11:48:44 +10:00
pci_dn.c [POWERPC] Fix section mismatch in PCI code 2007-09-19 15:25:34 +10:00
pmc.c [POWERPC] Fix typo: MMCR0_PMA0 != MMCR0_PMAO 2007-05-22 20:20:56 +10:00
ppc32.h
ppc_ksyms.c [POWERPC] Fix build errors when BLOCK=n 2007-09-22 14:49:22 +10:00
proc_ppc64.c [PATCH] mark struct file_operations const 2 2007-02-12 09:48:44 -08:00
process.c sched: restore deterministic CPU accounting on powerpc 2007-11-09 22:39:38 +01:00
prom.c [POWERPC] 4xx: Workaround for the 440EP(x)/GR(x) processors identical PVR issue. 2007-11-01 07:13:43 -05:00
prom_init.c [POWERPC] ] Fix memset size error 2007-11-08 14:15:33 +11:00
prom_parse.c Revert "[POWERPC] Don't complain if size-cells == 0 in prom_parse()" 2007-07-26 13:44:36 +10:00
ptrace.c Consolidate PTRACE_DETACH 2007-10-16 09:42:49 -07:00
ptrace32.c [POWERPC] Add CHECK_FULL_REGS in several places in ptrace code 2007-10-03 11:48:43 +10:00
rtas-proc.c [POWERPC] Fix ppc_rtas_progress_show() 2007-05-17 21:11:15 +10:00
rtas-rtc.c
rtas.c [POWERPC] Fix multiple bugs in rtas_ibm_suspend_me code 2007-11-19 15:11:30 +11:00
rtas_flash.c Slab API: remove useless ctor parameter and reorder parameters 2007-10-17 08:42:45 -07:00
rtas_pci.c [POWERPC] rtas_pci_ops: Use named structure member initializers 2007-08-17 11:01:53 +10:00
semaphore.c
setup-common.c Convert cpu_sibling_map to be a per cpu variable 2007-10-16 09:42:50 -07:00
setup.h
setup_32.c [POWERPC] Only call ppc_md.setup_arch() if it is provided 2007-10-11 20:39:36 +10:00
setup_64.c [POWERPC] Fix cache line vs. block size confusion 2007-11-08 14:15:30 +11:00
signal.c [POWERPC] Implement logging of unhandled signals 2007-10-12 14:05:18 +10:00
signal.h [POWERPC] Less ifdef's in signal.c/signal.h 2007-06-14 22:29:58 +10:00
signal_32.c [POWERPC] Implement logging of unhandled signals 2007-10-12 14:05:18 +10:00
signal_64.c [POWERPC] Implement logging of unhandled signals 2007-10-12 14:05:18 +10:00
smp-tbsync.c [POWERPC] Replace kmalloc+memset with kzalloc 2006-12-04 20:42:09 +11:00
smp.c Convert cpu_sibling_map to be a per cpu variable 2007-10-16 09:42:50 -07:00
softemu8xx.c [POWERPC] 8xx: Move softemu8xx.c from arch/ppc 2007-10-04 11:02:54 -05:00
suspend.c [PATCH] x86: Move swsusp __pa() dependent code to arch portion 2007-05-02 19:27:07 +02:00
swsusp.c powerpc: fixup hard_irq_disable semantics 2007-05-11 08:29:34 -07:00
swsusp_32.S [POWERPC] Make altivec code in swsusp_32.S depend on CONFIG_ALTIVEC 2007-11-08 14:15:34 +11:00
swsusp_64.c [POWERPC] powermac: Suspend to disk on G5 2007-05-07 20:31:14 +10:00
swsusp_asm64.S [POWERPC] powermac: Suspend to disk on G5 2007-05-07 20:31:14 +10:00
sys_ppc32.c remove include/asm-*/ipc.h 2007-10-17 08:42:55 -07:00
syscalls.c remove include/asm-*/ipc.h 2007-10-17 08:42:55 -07:00
sysfs.c [POWERPC] Remove warning in arch/powerpc/kernel/sysfs.c 2007-09-14 01:33:22 +10:00
systbl.S [POWERPC] Align the sys_call_table 2007-10-11 14:36:47 +10:00
tau_6xx.c
time.c [POWERPC] Demote clockevent printk to KERN_DEBUG 2007-11-13 16:22:44 +11:00
traps.c Use helpers to obtain task pid in printks (arch code) 2007-10-19 11:53:43 -07:00
udbg.c [POWERPC] Add early debug console for CPM serial ports. 2007-10-03 20:35:43 -05:00
udbg_16550.c [POWERPC] 4xx: Implement udbg_getc() for 440 2007-09-19 21:13:17 -05:00
vdso.c [POWERPC] Disable vDSO support for ARCH=ppc where it's not implemented 2007-10-11 20:25:25 +10:00
vecemu.c
vector.S
vio.c Driver core: change add_uevent_var to use a struct 2007-10-12 14:51:01 -07:00
vmlinux.lds.S [POWERPC] Fix link errors for allyesconfig 2007-11-08 14:15:33 +11:00