ACPICA: take ACPI_MTX_INTERPRETER in acpi_unload_table_id()
authorOctavian Purdila <octavian.purdila@intel.com>
Tue, 16 Dec 2014 16:12:30 +0000 (18:12 +0200)
committerRafael J. Wysocki <rafael.j.wysocki@intel.com>
Thu, 22 Jan 2015 00:16:44 +0000 (01:16 +0100)
acpi_tb_delete_namespace_by_owner() expects ACPI_MTX_INTERPRETER to be
taken. This fixes the following issue:

ACPI Error: Mutex [0x0] is not acquired, cannot release (20141107/utmutex-322)
Call Trace:
  [<ffffffff81b0bd28>] dump_stack+0x4f/0x7b
  [<ffffffff81546bfc>] acpi_ut_release_mutex+0x47/0x67
  [<ffffffff81542cf1>] acpi_tb_delete_namespace_by_owner+0x57/0x8d
  [<ffffffff81543ef1>] acpi_unload_table_id+0x3a/0x5e

Signed-off-by: Octavian Purdila <octavian.purdila@intel.com>
Signed-off-by: Rafael J. Wysocki <rafael.j.wysocki@intel.com>
drivers/acpi/acpica/tbxface.c

index 6482b0ded65214e120ebb51a01f8fc6790ca7353..9520ae19bb3726216b7a30f087fc2c6b831147e9 100644 (file)
@@ -281,6 +281,11 @@ acpi_status acpi_unload_table_id(acpi_owner_id id)
 
        ACPI_FUNCTION_TRACE(acpi_unload_table_id);
 
+       status = acpi_ut_acquire_mutex(ACPI_MTX_INTERPRETER);
+       if (ACPI_FAILURE(status)) {
+               return_ACPI_STATUS(status);
+       }
+
        /* Find table in the global table list */
        for (i = 0; i < acpi_gbl_root_table_list.current_table_count; ++i) {
                if (id != acpi_gbl_root_table_list.tables[i].owner_id) {
@@ -297,6 +302,8 @@ acpi_status acpi_unload_table_id(acpi_owner_id id)
                acpi_tb_set_table_loaded_flag(i, FALSE);
                break;
        }
+
+       (void)acpi_ut_release_mutex(ACPI_MTX_INTERPRETER);
        return_ACPI_STATUS(status);
 }