• Rafael J. Wysocki's avatar
    ACPI / ACPICA: Fix global lock acquisition · 9cd03144
    Rafael J. Wysocki authored
    There are two problems with the ACPICA's current implementation of
    the global lock acquisition.  First, acpi_ev_global_lock_handler(),
    which in fact is an interface to the outside of the kernel, doesn't
    validate its input, so it only works correctly if the other side
    (i.e. the ACPI firmware) is fully specification-compliant (as far
    as the global lock is concerned).  Unfortunately, that's known not
    to be the case on some systems (i.e. we get spurious global lock
    signaling interrupts without the pending flag set on some systems).
    Second, acpi_ev_global_lock_handler() attempts to acquire the global
    lock on behalf of a thread waiting for it without checking if there
    actually is such a thread.  Both of these shortcomings need to be
    addressed to prevent all possible race conditions from happening.
    
    Rework acpi_ev_global_lock_handler() so that it doesn't try to
    acquire the global lock and make it signal the availability of the
    global lock to the waiting thread instead.  Make sure that the
    availability of the global lock can only be signaled when there
    is a thread waiting for it and that it can't be signaled more than
    once in a row (to keep acpi_gbl_global_lock_semaphore in balance).
    Signed-off-by: default avatarRafael J. Wysocki <rjw@sisk.pl>
    Signed-off-by: default avatarLen Brown <len.brown@intel.com>
    9cd03144
evmisc.c 18.2 KB