Skip to content

Commit

Permalink
ACPI: Fix possible recursive locking in hwregs.c
Browse files Browse the repository at this point in the history
Calling pm-suspend might trigger a recursive lock in it's code path.
In function acpi_hw_clear_acpi_status, acpi_os_acquire_lock holds
the lock acpi_gbl_hardware_lock before calling acpi_hw_register_write(),
then without releasing acpi_gbl_hardware_lock, this function calls
acpi_ev_walk_gpe_list, which tries to hold acpi_gbl_gpe_lock.
Both acpi_gbl_hardware_lock and acpi_gbl_gpe_lock are at same
lock-class and which might cause lock recursion deadlock.

Following patch fixes this scenario by just releasing
acpi_gbl_hardware_lock before calling acpi_ev_walk_gpe_list.

 Changes since v0(https://lkml.org/lkml/2011/9/21/355):
	- Fix changelog, thanks to Lin Ming.

 Changes since v1 (https://lkml.org/lkml/2011/11/3/89):
	- Update changelog and rename goto label, courtesy Srivatsa S. Bhat.

Signed-off-by: Rakib Mullick <[email protected]>
Reviewed-by: Srivatsa S. Bhat <[email protected]>
Acked-by: Rafael J. Wysocki <[email protected]>
Signed-off-by: Len Brown <[email protected]>
  • Loading branch information
rmullick authored and lenb committed Nov 7, 2011
1 parent c3b92c8 commit f7f71cf
Showing 1 changed file with 6 additions and 5 deletions.
11 changes: 6 additions & 5 deletions drivers/acpi/acpica/hwregs.c
Original file line number Diff line number Diff line change
Expand Up @@ -269,16 +269,17 @@ acpi_status acpi_hw_clear_acpi_status(void)

status = acpi_hw_register_write(ACPI_REGISTER_PM1_STATUS,
ACPI_BITMASK_ALL_FIXED_STATUS);
if (ACPI_FAILURE(status)) {
goto unlock_and_exit;
}

acpi_os_release_lock(acpi_gbl_hardware_lock, lock_flags);

if (ACPI_FAILURE(status))
goto exit;

/* Clear the GPE Bits in all GPE registers in all GPE blocks */

status = acpi_ev_walk_gpe_list(acpi_hw_clear_gpe_block, NULL);

unlock_and_exit:
acpi_os_release_lock(acpi_gbl_hardware_lock, lock_flags);
exit:
return_ACPI_STATUS(status);
}

Expand Down

0 comments on commit f7f71cf

Please sign in to comment.