• Lv Zheng's avatar
    ACPICA: Update use of acpi_os_wait_events_complete interface. · 69c841b6
    Lv Zheng authored
    This patch cleans up all of the acpi_os_wait_events_complete() invocations to
    make it to be invoked inside of ACPICA in the way to accommodate Linux's
    work queue implementation.
    
    According to the report, current Linux kernel code is facing a boot time
    race issue in the acpi_remove_notify_handler(). This is because:
    Linux is using work queues to implement a deferred handler call environment
    while ACPICA expects OSPM to implement acpi_os_wait_events_complete() using
    wait queues.  The position to invoke a "waiter" is not suitable for a
    "flusher" as new invocations can be scheduled after this position and
    before the deletion of the handler from its management container.
    
    Since the following commit has deleted acpi_os_wait_events_complete()
    parameters, it thus might not be possible for OSPM to achieve a safe
    removal using wait queues.  This requires ACPICA to be changed accordingly
    to "flush" handlers rather than "wait" them to be drain up:
    
      Commit: 5ff986a2a9db11858247b71fe242fe17617229aa
      Date: Wed, 16 May 2012 13:36:07 -0700
      Subject: Introduce acpi_os_wait_events_complete interface.
    
      This interface will block until asynchronous events like notifies
      and GPEs are complete. Within ACPICA, it is called before a notify or GPE
      handler is removed. ACPICA BZ 868.
    
    This patch fixes this issue by invoking acpi_os_wait_events_complete() in the
    way to "flush" things - it thus should be put to the position after handler
    is removed from its management container but before it is destructed.
    
    The technical concerns are:
    1. MTX_NAMESPACE is used to protect things that acpi_os_wait_events_complete()
       might be waiting for, thus MTX_NAMESPACE must be unlocked before
       invoking acpi_os_wait_events_complete().
    2. MTX_NAMESPACE is also used to implement the serialization of
       acpi_install_notify_handler() and acpi_remove_notify_handler(). This patch
       changes this logic, thus if there are many
       acpi_install/remove_notify_handler() invoked in parallel, the
       acpi_os_wait_events_complete() might face the races which could cause it
       never running to an end.  Normally this will require additional code to
       implement a separate locking facility which is not implemented due to 3.
    3. Given ACPICA users will always invoke acpi_install_notify_handler() once
       during Linux module/device initialization and invoke
       acpi_remove_notify_handler() once during module/device finalization,
       problem stated in 2 will not happen in Linux environment due to the
       mutual exclusive module/device existence, this fix thus is sufficient.
    Same concerns can apply to acpi_install/remove_gpe_handler(). Reported and
    tested: Ronald Vink.  Fixed: Lv Zheng.
    
    References: https://bugzilla.kernel.org/show_bug.cgi?id=60583Signed-off-by: default avatarLv Zheng <lv.zheng@intel.com>
    Reported-and-Tested-by: default avatarRonald Vink <ronald.vink@boskalis.com>
    Signed-off-by: default avatarBob Moore <robert.moore@intel.com>
    Signed-off-by: default avatarRafael J. Wysocki <rafael.j.wysocki@intel.com>
    69c841b6
evxface.c 27.9 KB