ACPI: EC: Clear GPE on interrupt handling only
authorCompostella, Jeremy <jeremy.compostella@intel.com>
Tue, 6 Jun 2023 16:13:23 +0000 (09:13 -0700)
committerRafael J. Wysocki <rafael.j.wysocki@intel.com>
Mon, 12 Jun 2023 17:20:45 +0000 (19:20 +0200)
commit896e97bf99ecf0ecb6cc420bc2c9eb268d3edc05
treeded77d9cc602dd85d14c000991909db6a96ccc24
parent858fd168a95c5b9669aac8db6c14a9aeab446375
ACPI: EC: Clear GPE on interrupt handling only

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: Jeremy Compostella <jeremy.compostella@intel.com>
[ rjw: Changelog edits ]
Signed-off-by: Rafael J. Wysocki <rafael.j.wysocki@intel.com>
drivers/acpi/ec.c