Re: [PATCH 1/2] ACPICA: Save current masks of enabled GPEs after enable register writes
From: Rafael J. Wysocki <hidden>
Date: 2014-12-01 22:33:18
Also in:
linux-acpi
On Monday, December 01, 2014 05:03:04 AM Zheng, Lv wrote:
Hi, Rafaelquoted
From: Rafael J. Wysocki [mailto:rjw@rjwysocki.net] Sent: Monday, December 01, 2014 9:53 AM From: Rafael J. Wysocki <redacted> There is a race condition between acpi_hw_disable_all_gpes() or acpi_enable_all_wakeup_gpes() and acpi_ev_asynch_enable_gpe() such that if the latter wins the race, it may mistakenly enable a GPE disabled by the former. This may lead to premature system wakeups during system suspend and potentially to more serious consequences. The source of the problem is how acpi_hw_low_set_gpe() works when passed ACPI_GPE_CONDITIONAL_ENABLE as the second argument. In that case, the GPE will be enabled if the corresponding bit is set in the enable_for_run mask of the GPE enable register containing that bit. However, acpi_hw_disable_all_gpes() and acpi_enable_all_wakeup_gpes() don't modify the enable_for_run masks of GPE registers when writing to them. In consequence, if acpi_ev_asynch_enable_gpe(), which eventually calls acpi_hw_low_set_gpe() with the second argument equal to ACPI_GPE_CONDITIONAL_ENABLE, is executed in parallel with one of these functions, it may reverse changes made by them. To fix the problem, introduce a new enable_mask field in struct acpi_gpe_register_info in which to store the current mask of enabled GPEs and modify acpi_hw_low_set_gpe() to take this mask into account instead of enable_for_run when its second argument is equal to ACPI_GPE_CONDITIONAL_ENABLE. Also modify the low-level routines called by acpi_hw_disable_all_gpes(), acpi_enable_all_wakeup_gpes() and acpi_enable_all_runtime_gpes() to update the enable_mask masks of GPE registers after all (successful) writes to those registers.Both the solution and the patch looks OK. You'll still need the following fix to ensure the atomicity of acpi_ev_asynch_enable_gpe(): https://bugzilla.kernel.org/attachment.cgi?id=157391 Acked-by: Lv Zheng <redacted>
Thanks! Can you please submit the patch from https://bugzilla.kernel.org/attachment.cgi?id=157391 to linux-acpi officially? I'd like it to be included into 3.19 as a fix. Rafael