ACPI / ACPICA: Always use the same lock for GPE locking
Subsystems (2)
RFC PATCH 1/1 ACPI / ACPICA: Always use the same lock for GPE locking
From: Rafael J. Wysocki <[email protected]>
The GPE locking is now inconsistent, because acpi_set_gpe(), acpi_enable_gpe() and acpi_disable_gpe() use acpi_gbl_gpe_lock for this purpose, while acpi_clear_gpe() and acpi_get_gpe_status() use the ACPI_MTX_EVENTS mutex instead (the mutex is only acquired if they are not executed in interrupt context). Fix this by changing acpi_clear_gpe() and acpi_get_gpe_status() so that they acquire acpi_gbl_gpe_lock too.
Signed-off-by Rafael J. Wysocki <[email protected]>
Reported-by Robert Moore <[email protected]>
--- drivers/acpi/acpica/evxfevnt.c | 28 ++++++---------------------- 1 file changed, 6 insertions(+), 22 deletions(-)
drivers/acpi/acpica/evxfevnt.c +6 -22
@@ -476,19 +476,13 @@ ACPI_EXPORT_SYMBOL(acpi_clear_event)******************************************************************************/ acpi_status acpi_clear_gpe (acpi_handle gpe_device,u32 gpe_number,u32 flags) { +acpi_cpu_flags cpu_flags;acpi_status status =AE_OK ;struct acpi_gpe_event_info *gpe_event_info;ACPI_FUNCTION_TRACE (acpi_clear_gpe); -/* Use semaphore lock if not executing at interrupt level */ - -if (flags &ACPI_NOT_ISR ) { - status =acpi_ut_acquire_mutex (ACPI_MTX_EVENTS ); -if (ACPI_FAILURE (status)) { -return_ACPI_STATUS (status); - } - } + cpu_flags =acpi_os_acquire_lock (acpi_gbl_gpe_lock);/* Ensure that we have a valid GPE number */
@@ -501,9 +495,7 @@ acpi_status acpi_clear_gpe(acpi_handle g status =acpi_hw_clear_gpe (gpe_event_info); unlock_and_exit: -if (flags &ACPI_NOT_ISR ) { - (void )acpi_ut_release_mutex (ACPI_MTX_EVENTS ); - } +acpi_os_release_lock (acpi_gbl_gpe_lock, cpu_flags);return_ACPI_STATUS (status); }
@@ -584,19 +576,13 @@ acpi_status acpi_get_gpe_status(acpi_handle gpe_device, u32 gpe_number, u32 flags, acpi_event_status * event_status) { + acpi_cpu_flags cpu_flags;acpi_status status =AE_OK ;struct acpi_gpe_event_info *gpe_event_info;ACPI_FUNCTION_TRACE (acpi_get_gpe_status); -/* Use semaphore lock if not executing at interrupt level */ - -if (flags &ACPI_NOT_ISR ) { - status =acpi_ut_acquire_mutex (ACPI_MTX_EVENTS ); -if (ACPI_FAILURE (status)) { -return_ACPI_STATUS (status); - } - } + cpu_flags =acpi_os_acquire_lock (acpi_gbl_gpe_lock);/* Ensure that we have a valid GPE number */
@@ -614,9 +600,7 @@ acpi_get_gpe_status(acpi_handle gpe_devi *event_status |=ACPI_EVENT_FLAG_HANDLE ; unlock_and_exit: -if (flags &ACPI_NOT_ISR ) { - (void )acpi_ut_release_mutex (ACPI_MTX_EVENTS ); - } +acpi_os_release_lock (acpi_gbl_gpe_lock, cpu_flags);return_ACPI_STATUS (status); }