• Compostella, Jeremy's avatar
    ACPI: EC: Clear GPE on interrupt handling only · 896e97bf
    Compostella, Jeremy authored
    On multiple devices I work on, we noticed that
    /sys/firmware/acpi/interrupts/sci_not is non-zero and keeps increasing
    over time.
    
    It turns out that there is a race condition between servicing a GPE
    interrupt and handling task driven transactions.
    
    If a GPE interrupt is received at the same time ec_poll() is running,
    the advance_transaction() clears the GPE flag and the interrupt is not
    serviced as acpi_ev_detect_gpe() relies on the GPE flag to call the
    handler. As a result, `sci_not' is increased.
    
    To address this, move the GPE status check and clearing from
    advance_transaction() directly into acpi_ec_handle_interrupt(), so the
    EC GPE only gets cleared in the interrupt handling path.
    Signed-off-by: default avatarJeremy Compostella <jeremy.compostella@intel.com>
    [ rjw: Changelog edits ]
    Signed-off-by: default avatarRafael J. Wysocki <rafael.j.wysocki@intel.com>
    896e97bf
ec.c 58.4 KB