[<prev] [next>] [thread-next>] [day] [month] [year] [list]
Message-Id: <20200306130341.199467200@linutronix.de>
Date: Fri, 06 Mar 2020 14:03:41 +0100
From: Thomas Gleixner <tglx@...utronix.de>
To: LKML <linux-kernel@...r.kernel.org>
Cc: Marc Zyngier <maz@...nel.org>, x86@...nel.org,
Bjorn Helgaas <bhelgaas@...gle.com>, linux-pci@...r.kernel.org,
Keith Busch <kbusch@...nel.org>,
Kuppuswamy Sathyanarayanan
<sathyanarayanan.kuppuswamy@...ux.intel.com>
Subject: [patch 0/7] genirq/PCI: Sanitize interrupt injection
Kuppuswamy triggered a NULL pointer dereference via the AER error injection
mechanism in the low level APIC code.
https://lore.kernel.org/r/f54208d62407901b5de15ce8c3d078c70fc7a1d0.1582313239.git.sathyanarayanan.kuppuswamy@linux.intel.com
It turned out that AER error injection is calling generic_handle_irq() from
task context which is unsafe for x86 interrupts which end up being handled
by the APIC. The fragile interrupt affinity handling which is imposed by
the x86 hardware does not allow to call into this code except from actual
interrupt context.
While the pointer could be checked this would just paper over the problem
and still be able to trigger warnings or silently corrupting state.
This series addresses the problem:
- Prevent the invocation of generic_handle_irq() from non interrupt
context on affected interrupts.
- Add a few missing sanity checks to the existing debugfs injection
mechanism
- Convert the debugfs injection into a function which can be invoked from
other places.
This provides a halfways safe interface to inject interrupts via the
irq_retrigger mechanism which does the injection via IPI.
This interface is solely for debug and testing purposes as it still can
make a device interrupts stale on x86 under very obscure and hard to
hit circumstances. For debug and error injection testing this is
acceptable. For any other use not.
- Change the AER code to use the new interface.
Thanks,
tglx
----
arch/x86/kernel/apic/vector.c | 6 +
drivers/pci/pcie/Kconfig | 1
drivers/pci/pcie/aer_inject.c | 6 -
include/linux/interrupt.h | 2
include/linux/irq.h | 13 +++
kernel/irq/Kconfig | 5 +
kernel/irq/chip.c | 2
kernel/irq/debugfs.c | 28 --------
kernel/irq/internals.h | 10 ++
kernel/irq/irqdesc.c | 6 +
kernel/irq/resend.c | 143 +++++++++++++++++++++++++++++++-----------
11 files changed, 153 insertions(+), 69 deletions(-)
Powered by blists - more mailing lists