ACPICA: Fix for update of the Global Lock Handle
Fixed a problem where the global lock handle was not properly updated if a thread that acquired the global lock via executing AML code then attempted to acquire the lock via the AcpiAcquireGlobalLock interface. Signed-off-by: Bob Moore <robert.moore@intel.com> Signed-off-by: Alexey Starikovskiy <astarikovskiy@suse.de> Signed-off-by: Len Brown <len.brown@intel.com>
This commit is contained in:
@@ -460,6 +460,19 @@ acpi_status acpi_ev_acquire_global_lock(u16 timeout)
|
|||||||
acpi_ev_global_lock_thread_id = acpi_os_get_thread_id();
|
acpi_ev_global_lock_thread_id = acpi_os_get_thread_id();
|
||||||
acpi_ev_global_lock_acquired++;
|
acpi_ev_global_lock_acquired++;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Update the global lock handle and check for wraparound. The handle is
|
||||||
|
* only used for the external global lock interfaces, but it is updated
|
||||||
|
* here to properly handle the case where a single thread may acquire the
|
||||||
|
* lock via both the AML and the acpi_acquire_global_lock interfaces. The
|
||||||
|
* handle is therefore updated on the first acquire from a given thread
|
||||||
|
* regardless of where the acquisition request originated.
|
||||||
|
*/
|
||||||
|
acpi_gbl_global_lock_handle++;
|
||||||
|
if (acpi_gbl_global_lock_handle == 0) {
|
||||||
|
acpi_gbl_global_lock_handle = 1;
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Make sure that a global lock actually exists. If not, just treat
|
* Make sure that a global lock actually exists. If not, just treat
|
||||||
* the lock as a standard mutex.
|
* the lock as a standard mutex.
|
||||||
|
@@ -782,15 +782,8 @@ acpi_status acpi_acquire_global_lock(u16 timeout, u32 * handle)
|
|||||||
acpi_os_get_thread_id());
|
acpi_os_get_thread_id());
|
||||||
|
|
||||||
if (ACPI_SUCCESS(status)) {
|
if (ACPI_SUCCESS(status)) {
|
||||||
/*
|
|
||||||
* If this was the first acquisition of the Global Lock by this thread,
|
|
||||||
* create a new handle. Otherwise, return the existing handle.
|
|
||||||
*/
|
|
||||||
if (acpi_gbl_global_lock_mutex->mutex.acquisition_depth == 1) {
|
|
||||||
acpi_gbl_global_lock_handle++;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Return the global lock handle */
|
/* Return the global lock handle (updated in acpi_ev_acquire_global_lock) */
|
||||||
|
|
||||||
*handle = acpi_gbl_global_lock_handle;
|
*handle = acpi_gbl_global_lock_handle;
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user