linux/arch
Helge Deller 804a6f7fb4 parisc: Filter out spurious interrupts in PA-RISC irq handler
commit b1b4e435e4 upstream.

When detecting a serial port on newer PA-RISC machines (with iosapic) we have a
long way to go to find the right IRQ line, registering it, then registering the
serial port and the irq handler for the serial port. During this phase spurious
interrupts for the serial port may happen which then crashes the kernel because
the action handler might not have been set up yet.

So, basically it's a race condition between the serial port hardware and the
CPU which sets up the necessary fields in the irq sructs. The main reason for
this race is, that we unmask the serial port irqs too early without having set
up everything properly before (which isn't easily possible because we need the
IRQ number to register the serial ports).

This patch is a work-around for this problem. It adds checks to the CPU irq
handler to verify if the IRQ action field has been initialized already. If not,
we just skip this interrupt (which isn't critical for a serial port at bootup).
The real fix would probably involve rewriting all PA-RISC specific IRQ code
(for CPU, IOSAPIC, GSC and EISA) to use IRQ domains with proper parenting of
the irq chips and proper irq enabling along this line.

This bug has been in the PA-RISC port since the beginning, but the crashes
happened very rarely with currently used hardware.  But on the latest machine
which I bought (a C8000 workstation), which uses the fastest CPUs (4 x PA8900,
1GHz) and which has the largest possible L1 cache size (64MB each), the kernel
crashed at every boot because of this race. So, without this patch the machine
would currently be unuseable.

For the record, here is the flow logic:
1. serial_init_chip() in 8250_gsc.c calls iosapic_serial_irq().
2. iosapic_serial_irq() calls txn_alloc_irq() to find the irq.
3. iosapic_serial_irq() calls cpu_claim_irq() to register the CPU irq
4. cpu_claim_irq() unmasks the CPU irq (which it shouldn't!)
5. serial_init_chip() then registers the 8250 port.
Problems:
- In step 4 the CPU irq shouldn't have been registered yet, but after step 5
- If serial irq happens between 4 and 5 have finished, the kernel will crash

Signed-off-by: Helge Deller <deller@gmx.de>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
History 2015-09-29 19:26:12 +02:00
..
alpha alpha: kernel: osf_sys: Set 'kts.tv_nsec' only when 'tv' has effect 2015-05-26 10:01:51 -07:00
arc ARC: Make ARC bitops "safer" (add anti-optimization) 2015-08-10 12:21:57 -07:00
arm arm/arm64: KVM: vgic: Check for !irqchip_in_kernel() when mapping resources 2015-09-29 19:26:00 +02:00
arm64 arm64: KVM: Disable virtual timer even if the guest is not using it 2015-09-29 19:26:01 +02:00
avr32 avr32: handle NULL as a valid clock object 2015-08-10 12:21:58 -07:00
blackfin blackfin: Fix build error 2015-06-10 10:19:24 -07:00
c6x C6X Fixes for v4.1 2015-04-16 18:48:55 -04:00
cris CRIS changes for 4.1 2015-04-26 13:31:05 -07:00
frv Devicetree updates for 4.1: 2015-04-24 08:46:18 -07:00
hexagon Merge branch 'exec_domain_rip_v2' of git://git.kernel.org/pub/scm/linux/kernel/git/rw/misc 2015-04-15 13:53:55 -07:00
ia64 ia64: make cpu_callin_map non-volatile. 2015-06-02 10:07:03 -07:00
m32r m32r: make flush_cpumask non-volatile. 2015-05-09 11:09:29 -07:00
m68k m68knommu: force setting of CONFIG_CLOCK_FREQ for ColdFire 2015-08-03 09:28:58 -07:00
metag Metag architecture changes for v4.1 2015-04-24 07:56:50 -07:00
microblaze microblaze: use asm-generic for seccomp.h 2015-04-17 09:04:10 -04:00
mips MIPS: math-emu: Emulate missing BC1{EQ,NE}Z instructions 2015-09-29 19:25:57 +02:00
mn10300 Devicetree updates for 4.1: 2015-04-24 08:46:18 -07:00
nios2 nios2 update for v4.1-rc1 2015-04-24 07:59:07 -07:00
openrisc openrisc: fix CONFIG_UID16 setting 2015-08-03 09:28:58 -07:00
parisc parisc: Filter out spurious interrupts in PA-RISC irq handler 2015-09-29 19:26:12 +02:00
powerpc powerpc/mm: Recompute hash value after a failed update 2015-09-29 19:26:05 +02:00
s390 s390/setup: fix novx parameter 2015-09-21 10:05:27 -07:00
score score: Fix exception handler label 2015-06-10 10:19:47 -07:00
sh Merge branch 'for-linus' of git://git.infradead.org/users/vkoul/slave-dma 2015-04-24 09:49:37 -07:00
sparc sparc64: Fix userspace FPU register corruptions. 2015-08-16 20:52:16 -07:00
tile signal: fix information leak in copy_siginfo_from_user32 2015-08-16 20:52:26 -07:00
um Merge branch 'exec_domain_rip_v2' of git://git.kernel.org/pub/scm/linux/kernel/git/rw/misc 2015-04-15 13:53:55 -07:00
unicore32 Merge branch 'exec_domain_rip_v2' of git://git.kernel.org/pub/scm/linux/kernel/git/rw/misc 2015-04-15 13:53:55 -07:00
x86 x86/mm: Initialize pmd_idx in page_table_range_init_count() 2015-09-29 19:26:06 +02:00
xtensa xtensa: fix kernel register spilling 2015-09-21 10:05:42 -07:00
.gitignore arch: Ignore arch/i386 and arch/x86_64 2008-01-19 21:29:39 -08:00
Kconfig powerpc updates for 4.1 2015-04-16 13:53:32 -05:00