Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit e5567afa authored by Bob Moore's avatar Bob Moore Committed by Len Brown
Browse files

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: default avatarBob Moore <robert.moore@intel.com>
Signed-off-by: default avatarAlexey Starikovskiy <astarikovskiy@suse.de>
Signed-off-by: default avatarLen Brown <len.brown@intel.com>
parent 235eebbd
Loading
Loading
Loading
Loading
+13 −0
Original line number Diff line number Diff line
@@ -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_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
	 * the lock as a standard mutex.
+1 −8
Original line number Diff line number Diff line
@@ -782,15 +782,8 @@ acpi_status acpi_acquire_global_lock(u16 timeout, u32 * handle)
					      acpi_os_get_thread_id());

	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;
	}