• Rafael J. Wysocki's avatar
    ACPI: OSL: Use a threaded interrupt handler for SCI · 7a36b901
    Rafael J. Wysocki authored
    In the current arrangement, all of the acpi_ev_sci_xrupt_handler() code
    is run as an interrupt handler for the SCI, in interrupt context.  Among
    other things, this causes it to run with local interrupts off which
    can be problematic if many GPEs are enabled and they are located in the
    I/O address space, for example (because in that case local interrupts
    will be off for the duration of all of the GPE hardware accesses carried
    out while handling an SCI combined and that may be quite a bit of time
    in extreme scenarios).
    
    However, there is no particular reason why the code in question really
    needs to run in interrupt context and in particular, it has no specific
    reason to run with local interrupts off.  The only real requirement is
    to prevent multiple instences of it from running in parallel with each
    other, but that can be achieved regardless.
    
    For this reason, use request_threaded_irq() instead of request_irq() for
    the ACPI SCI and pass IRQF_ONESHOT to it in flags to indicate that the
    interrupt needs to be masked while its handling thread is running so as
    to prevent it from re-triggering while it is being handled (and in
    particular until the final handled/not handled outcome is determined).
    
    While at it, drop a redundant local variable from acpi_irq().
    Signed-off-by: default avatarRafael J. Wysocki <rafael.j.wysocki@intel.com>
    Tested-by: default avatarMario Limonciello <mario.limonciello@amd.com>
    Tested-by: default avatarMika Westerberg <mika.westerberg@linux.intel.com>
    7a36b901
osl.c 40.7 KB