• Rafael J. Wysocki's avatar
    ACPI / EC / PM: Fix race between EC transactions and system suspend · d5a64513
    Rafael J. Wysocki authored
    There still is a race that may result in suspending the system in
    the middle of an EC transaction in progress, which leads to problems
    (like the kernel thinking that the ACPI global lock is held during
    resume while in fact it's not).
    
    To remove the race condition, modify the ACPI platform suspend and
    hibernate callbacks so that EC transactions are blocked right after
    executing the _PTS global control method and are allowed to happen
    again right after the low-level wakeup.
    
    Introduce acpi_pm_freeze() that will disable GPEs, wait until the
    event queues are empty and block EC transactions.  Use it wherever
    GPEs are disabled in preparation for switching local interrupts off.
    Introduce acpi_pm_thaw() that will allow EC transactions to happen
    again and enable runtime GPEs.  Use it to balance acpi_pm_freeze()
    wherever necessary.
    
    In addition to that use acpi_ec_resume_transactions_early() to
    unblock EC transactions as early as reasonably possible during
    resume.  Also unblock EC transactions in acpi_hibernation_finish()
    and in the analogous suspend routine to make sure that the EC
    transactions are enabled in all error paths.
    
    Fixes https://bugzilla.kernel.org/show_bug.cgi?id=14668Signed-off-by: default avatarRafael J. Wysocki <rjw@sisk.pl>
    Reported-and-tested-by: default avatarMaxim Levitsky <maximlevitsky@gmail.com>
    Signed-off-by: default avatarLen Brown <len.brown@intel.com>
    d5a64513
ec.c 29.2 KB