linux/include/asm-ia64
Russ Anderson 1612b18ccb [IA64] Support multiple CPUs going through OS_MCA
Linux does not gracefully deal with multiple processors going
through OS_MCA aa part of the same MCA event.  The first cpu
into OS_MCA grabs the ia64_mca_serialize lock.  Subsequent
cpus wait for that lock, preventing them from reporting in as
rendezvoused.  The first cpu waits 5 seconds then complains
that all the cpus have not rendezvoused.  The first cpu then
handles its MCA and frees up all the rendezvoused cpus and
releases the ia64_mca_serialize lock.  One of the subsequent
cpus going thought OS_MCA then gets the ia64_mca_serialize
lock, waits another 5 seconds and then complains that none of
the other cpus have rendezvoused.

This patch allows multiple CPUs to gracefully go through OS_MCA.

The first CPU into ia64_mca_handler() grabs a mca_count lock.
Subsequent CPUs into ia64_mca_handler() are added to a list of cpus
that need to go through OS_MCA (a bit set in mca_cpu), and report
in as rendezvoused, and but spin waiting their turn.

The first CPU sees everyone rendezvous, handles his MCA, wakes up
one of the other CPUs waiting to process their MCA (by clearing
one mca_cpu bit), and then waits for the other cpus to complete
their MCA handling.  The next CPU handles his MCA and the process
repeats until all the CPUs have handled their MCA.  When the last
CPU has handled it's MCA, it sets monarch_cpu to -1, releasing all
the CPUs.

In testing this works more reliably and faster.

Thanks to Keith Owens for suggesting numerous improvements
to this code.

Signed-off-by: Russ Anderson <rja@sgi.com>
Signed-off-by: Tony Luck <tony.luck@intel.com>
2007-07-11 11:50:11 -07:00
..
sn [IA64] add sn_register_pmi_handler oemcall 2007-07-11 11:34:21 -07:00
a.out.h
acpi-ext.h
acpi.h [IA64] Cleanup acpi header to reuse the generic _PDC defines 2007-05-24 10:15:06 -07:00
agp.h
asmmacro.h [IA64] remove per-cpu ia64_phys_stacked_size_p8 2007-02-06 15:04:18 -08:00
atomic.h atomic.h: atomic_add_unless as inline. Remove system.h atomic.h circular dependency 2007-05-08 11:15:20 -07:00
auxvec.h
bitops.h
break.h [IA64] enable trap code on slot 1 2006-12-12 12:00:55 -08:00
bug.h
bugs.h
byteorder.h
cache.h
cacheflush.h [PATCH] Optimize D-cache alias handling on fork 2006-12-13 09:27:08 -08:00
checksum.h [PATCH] fix prototype of csum_ipv6_magic() (ia64) 2007-01-23 11:09:49 -08:00
compat.h
cpu.h
cputime.h
current.h
cyclone.h
delay.h
device.h ACPI: Change ACPI to use dev_archdata instead of firmware_data 2006-12-01 14:52:01 -08:00
div64.h
dma-mapping.h [PATCH] ia64: fix noncoherent DMA API so devres builds 2007-02-14 08:09:51 -08:00
dma.h [IA64] swiotlb bug fixes 2007-02-05 18:46:40 -08:00
dmi.h
elf.h
emergency-restart.h
errno.h
esi.h [IA64] remove bogus prototype ia64_esi_init() 2007-02-05 14:14:29 -08:00
fcntl.h
fpswa.h
fpu.h
futex.h [PATCH] mm: pagefault_{disable,enable}() 2006-12-07 08:39:21 -08:00
gcc_intrin.h
hardirq.h
hw_irq.h [IA64] Optional method to purge the TLB on SN systems 2007-05-08 14:50:43 -07:00
ia32.h
ia64regs.h
ide.h
intel_intrin.h
intrinsics.h
io.h [IA64] make ioremap avoid unsupported attributes 2007-03-30 09:37:41 -07:00
ioctl.h
ioctls.h
iosapic.h [IA64] Fix some section mismatch errors 2007-05-07 13:17:00 -07:00
ipcbuf.h
irq_regs.h
irq.h [IA64] SN: validate smp_affinity mask on intr redirect 2007-05-11 09:35:38 -07:00
Kbuild [PATCH] cleanup asm/setup.h userspace visibility 2006-12-07 08:39:46 -08:00
kdebug.h [IA64] optimize pagefaults a little 2007-05-16 09:00:51 -07:00
kexec.h kdump/kexec: calculate note size at compile time 2007-05-08 11:15:07 -07:00
kmap_types.h
kprobes.h [IA64] optimize pagefaults a little 2007-05-16 09:00:51 -07:00
kregs.h [IA64] relax per-cpu TLB requirement to DTC 2007-02-06 15:04:48 -08:00
libata-portmap.h ATA convert GSI to irq on ia64 2007-02-15 18:04:53 -05:00
linkage.h
local.h local_t: ia64 extension 2007-05-08 11:15:20 -07:00
machvec_dig.h
machvec_hpsim.h
machvec_hpzx1_swiotlb.h
machvec_hpzx1.h
machvec_init.h
machvec_sn2.h [IA64] IA64 Kexec/kdump 2006-12-07 09:51:35 -08:00
machvec.h [PATCH] ia64: platform_kernel_launch_event is noop on generic kernel 2007-03-18 11:35:07 -07:00
mc146818rtc.h
mca_asm.h
mca.h [IA64] Support multiple CPUs going through OS_MCA 2007-07-11 11:50:11 -07:00
meminit.h [IA64] min_low_pfn and max_low_pfn calculation fix 2007-03-20 13:41:57 -07:00
mman.h
mmu_context.h [PATCH] x86: PARAVIRT: add hooks to intercept mm creation and destruction 2007-05-02 19:27:14 +02:00
mmu.h
mmzone.h
module.h
msgbuf.h
mutex.h
namei.h
nodedata.h
numa.h
page.h [IA64] Fix DISCONTIGMEM without VIRTUAL_MEM_MAP 2006-12-07 11:24:03 -08:00
pal.h Pull error-inject into release branch 2007-04-30 13:55:43 -07:00
param.h
parport.h
patch.h [IA64] remove per-cpu ia64_phys_stacked_size_p8 2007-02-06 15:04:18 -08:00
pci.h [IA64] pci_get_legacy_ide_irq should return irq (not GSI) 2007-03-08 10:04:44 -08:00
percpu.h
perfmon_default_smpl.h
perfmon.h
pgalloc.h [IA64] Quicklist support for IA64 2007-05-11 09:40:00 -07:00
pgtable.h Rework ptep_set_access_flags and fix sun4c 2007-06-16 13:16:16 -07:00
poll.h Consolidate asm/poll.h 2007-05-11 08:29:34 -07:00
posix_types.h [PATCH] FD_ZERO build fix 2007-01-11 18:18:22 -08:00
processor.h Pull percpu-dtc into release branch 2007-04-30 13:56:00 -07:00
ptrace_offsets.h
ptrace.h
resource.h [IA64] Remove stack hard limit on ia64 2007-03-06 14:48:19 -08:00
rse.h
rwsem.h
sal.h [IA64] whitespace fixes for include/asm-ia64/sal.h 2007-03-08 09:58:13 -08:00
scatterlist.h PCI: scatterlist.h needs types.h 2007-05-02 19:02:34 -07:00
sections.h [IA64] remove per-cpu ia64_phys_stacked_size_p8 2007-02-06 15:04:18 -08:00
segment.h
semaphore.h
sembuf.h
serial.h
setup.h [PATCH] ia64: 2048-byte command line 2007-02-12 09:48:39 -08:00
shmbuf.h
shmparam.h
sigcontext.h
siginfo.h
signal.h
smp.h Always ask the hardware to obtain hardware processor id - ia64 2007-05-09 12:30:49 -07:00
socket.h [NET]: Adding SO_TIMESTAMPNS / SCM_TIMESTAMPNS support 2007-04-25 22:24:21 -07:00
sockios.h [NET]: Introduce SIOCGSTAMPNS ioctl to get timestamps with nanosec resolution 2007-04-25 22:24:04 -07:00
sparsemem.h
spinlock_types.h
spinlock.h
stat.h
statfs.h
string.h
suspend.h
system.h
termbits.h [PATCH] tty: preparatory structures for termios revamp 2006-12-08 08:28:56 -08:00
termios.h [PATCH] consolidate line discipline number definitions 2007-02-11 10:51:26 -08:00
thread_info.h Merge git://git.kernel.org/pub/scm/linux/kernel/git/aegl/linux-2.6 2007-05-09 13:38:45 -07:00
timex.h
tlb.h
tlbflush.h [IA64] Optional method to purge the TLB on SN systems 2007-05-08 14:50:43 -07:00
topology.h [PATCH] sched: remove SMT nice 2007-03-05 07:57:51 -08:00
types.h
uaccess.h
ucontext.h
unaligned.h
uncached.h
unistd.h [IA64] Fix bogus messages about system calls not implemented. 2007-05-18 14:15:58 -07:00
unwind.h [IA64] Remove sparse warning from unwind code 2007-03-08 10:28:48 -08:00
user.h
ustack.h
vga.h
xor.h