• Thomas Gleixner's avatar
    PCI/AER: Fix the broken interrupt injection · 9ae05225
    Thomas Gleixner authored
    The AER error injection mechanism just blindly abuses generic_handle_irq()
    which is really not meant for consumption by random drivers. The include of
    linux/irq.h should have been a red flag in the first place. Driver code,
    unless implementing interrupt chips or low level hypervisor functionality
    has absolutely no business with that.
    
    Invoking generic_handle_irq() from non interrupt handling context can have
    nasty side effects at least on x86 due to the hardware trainwreck which
    makes interrupt affinity changes a fragile beast. Sathyanarayanan triggered
    a NULL pointer dereference in the low level APIC code that way. While the
    particular pointer could be checked this would only paper over the issue
    because there are other ways to trigger warnings or silently corrupt state.
    
    Invoke the new irq_inject_interrupt() mechanism, which has the necessary
    sanity checks in place and injects the interrupt via the irq_retrigger()
    mechanism, which is at least halfways safe vs. the fragile x86 affinity
    change mechanics.
    
    It's safe on x86 as it does not corrupt state, but it still can cause a
    premature completion of an interrupt affinity change causing the interrupt
    line to become stale. Very unlikely, but possible.
    
    For regular operations this is a non issue as AER error injection is meant
    for debugging and testing and not for usage on production systems. People
    using this should better know what they are doing.
    
    Fixes: 390e2db8 ("PCI/AER: Abstract AER interrupt handling")
    Reported-by: sathyanarayanan.kuppuswamy@linux.intel.com
    Signed-off-by: default avatarThomas Gleixner <tglx@linutronix.de>
    Tested-by: default avatarKuppuswamy Sathyanarayanan <sathyanarayanan.kuppuswamy@linux.intel.com>
    Reviewed-by: default avatarKuppuswamy Sathyanarayanan <sathyanarayanan.kuppuswamy@linux.intel.com>
    Cc: Bjorn Helgaas <bhelgaas@google.com>
    Link: https://lkml.kernel.org/r/20200306130624.098374457@linutronix.de
    9ae05225
aer_inject.c 12.6 KB