1
linux/arch/ia64/kernel
Alex Chiang 3463a93def [IA64] Update check_sal_cache_flush to use platform_send_ipi()
check_sal_cache_flush is used to detect broken firmware that drops
pending interrupts.

The old implementation schedules a timer interrupt for itself in
the future by getting the current value of the Interval Timer
Counter + 1000 cycles, waits for the interrupt to be pended, calls
SAL_CACHE_FLUSH, and finally checks to see if the interrupt is
still pending.

This implementation can cause problems for virtual machine code if
the process of scheduling the timer interrupt takes more than 1000
cycles; the virtual machine can end up sleeping for several hundred
years while waiting for the ITC to wrap around.

The fix is to use platform_send_ipi. The processor will still send
an interrupt to itself, using the IA64_IPI_DM_INT delivery mode,
which causes the IPI to look like an external interrupt. The rest
of the SAL_CACHE_FLUSH + checking to see if the interrupt is still
pending remains unchanged.

This fix has been boot tested successfully on:

	- intel tiger2
	- hp rx6600
	- hp rx5670

The rx5670 has known buggy firmware, where SAL_CACHE_FLUSH drops
pending interrupts. A boot test on this machine showed this message
on the console:

SAL: SAL_CACHE_FLUSH drops interrupts; PAL_CACHE_FLUSH will be used instead

Which proves that the self-inflicted IPI approach is viable. And
as expected, the other tested platforms correctly did not display
the warning.

Signed-off-by: Alex Chiang <achiang@hp.com>
Signed-off-by: Tony Luck <tony.luck@intel.com>
2008-06-11 16:40:33 -07:00
..
cpufreq
.gitignore [IA64] Add gate.lds to list of files ignored by Git 2007-11-06 15:39:45 -08:00
acpi-ext.c
acpi-processor.c ACPI: Set _PSD ACPI_PDC_SMP_T_SWCOORD 2008-02-02 02:22:43 -05:00
acpi.c [IA64] Properly unregister legacy interrupts 2008-05-14 16:00:14 -07:00
asm-offsets.c ia64: use kbuild.h macros instead of defining macros in asm-offsets.c 2008-04-29 08:06:29 -07:00
audit.c
brl_emu.c
crash_dump.c
crash.c [IA64] simplify notify hooks in mca.c 2008-04-22 08:56:38 -07:00
cyclone.c
efi_stub.S
efi.c [IA64] Kernel parameter for max number of concurrent global TLB purges 2008-04-04 11:06:38 -07:00
entry.h
entry.S [IA64] trivial cleanup for entry.S 2008-05-14 15:56:09 -07:00
err_inject.c
esi_stub.S
esi.c
fsys.S Pull miscellaneous into release branch 2008-04-17 10:14:51 -07:00
fsyscall_gtod_data.h [IA64] generalize attribute of fsyscall_gtod_data 2008-02-04 15:36:36 -08:00
gate-data.S
gate.lds.S [IA64] increase .data.patch offset 2007-12-07 14:28:02 -08:00
gate.S
head.S [IA64] VIRT_CPU_ACCOUNTING (accurate cpu time accounting) 2008-02-20 12:55:37 -08:00
ia64_ksyms.c Generic semaphore implementation 2008-04-17 10:42:34 -04:00
init_task.c [PATCH] take init_files to fs/file.c 2008-05-16 17:22:20 -04:00
iosapic.c [IA64] remove remaining __FUNCTION__ occurrences 2008-03-06 09:19:27 -08:00
irq_ia64.c [IA64] arch/ia64/kernel/: use time_* macros 2008-04-09 10:38:30 -07:00
irq_lsapic.c
irq.c [IA64] fix section mismatch in arch/ia64/kernel/irq.c 2008-04-30 14:08:01 -07:00
ivt.S [IA64] Workaround for RSE issue 2008-05-27 13:24:39 -07:00
jprobes.S
kprobes.c [IA64] kprobes: kprobe-booster for ia64 2008-04-09 10:36:43 -07:00
machine_kexec.c vmcoreinfo: fix the configuration dependencies 2008-02-07 08:42:25 -08:00
machvec.c
Makefile Generic semaphore implementation 2008-04-17 10:42:34 -04:00
mca_asm.S [IA64] Add API for allocating Dynamic TR resource. 2008-04-03 11:02:58 -07:00
mca_drv_asm.S [IA64] mca style cleanup 2008-02-04 15:42:06 -08:00
mca_drv.c [IA64] mca style cleanup 2008-02-04 15:42:06 -08:00
mca_drv.h [IA64] mca style cleanup 2008-02-04 15:42:06 -08:00
mca.c [IA64] simplify notify hooks in mca.c 2008-04-22 08:56:38 -07:00
minstate.h [IA64] Workaround for RSE issue 2008-05-27 13:24:39 -07:00
module.c [IA64] remove remaining __FUNCTION__ occurrences 2008-03-06 09:19:27 -08:00
msi_ia64.c [IA64] Fix irq migration in multiple vector domain 2008-03-04 14:16:20 -08:00
numa.c [IA64] Minimize per_cpu reservations. 2008-04-08 13:51:35 -07:00
pal.S
palinfo.c [IA64] Remove NULL pointer check for argument never passed as NULL. 2008-05-14 15:58:27 -07:00
patch.c [IA64] Workaround for RSE issue 2008-05-27 13:24:39 -07:00
perfmon_default_smpl.c [IA64] remove remaining __FUNCTION__ occurrences 2008-03-06 09:19:27 -08:00
perfmon_generic.h
perfmon_itanium.h
perfmon_mckinley.h
perfmon_montecito.h
perfmon.c [IA64] perfmon: fix async exit bug 2008-06-11 15:24:13 -07:00
process.c [IA64] fix interrupt masking for pending works on kernel leave 2008-05-14 15:55:35 -07:00
ptrace.c [IA64] remove duplicate code for register access 2008-03-12 16:28:02 -07:00
relocate_kernel.S
sal.c [IA64] Update check_sal_cache_flush to use platform_send_ipi() 2008-06-11 16:40:33 -07:00
salinfo.c ia64: use non-racy method for proc entries creation 2008-04-29 08:06:21 -07:00
setup.c [IA64] Workaround for RSE issue 2008-05-27 13:24:39 -07:00
sigframe.h
signal.c [IA64] TS_RESTORE_SIGMASK 2008-05-01 14:29:44 -07:00
smp.c [IA64] smp.c coding style fix 2008-05-01 14:29:12 -07:00
smpboot.c [IA64] Remove printk noise on unimplemented SAL_PHYSICAL_ID_INFO 2008-04-29 13:51:28 -07:00
sys_ia64.c
time.c [IA64] fix section mismatch in arch/ia64/kernel/irq.c 2008-04-30 14:08:01 -07:00
topology.c [IA64] fix section mismatch in arch/ia64/kernel/topology.c 2008-04-30 14:08:07 -07:00
traps.c [IA64] honor notify_die() returning NOTIFY_STOP 2008-02-05 08:26:44 -08:00
unaligned.c [IA64] arch/ia64/kernel/: use time_* macros 2008-04-09 10:38:30 -07:00
uncached.c [IA64] allocate multiple contiguous pages via uncached allocator 2008-04-29 13:49:01 -07:00
unwind_decoder.c
unwind_i.h
unwind.c [IA64] remove remaining __FUNCTION__ occurrences 2008-03-06 09:19:27 -08:00
vmlinux.lds.S [IA64] Workaround for RSE issue 2008-05-27 13:24:39 -07:00