ACPICA: Tables: Add acpi_tb_unload_table()
authorLv Zheng <lv.zheng@intel.com>
Wed, 30 Nov 2016 07:21:26 +0000 (15:21 +0800)
committerRafael J. Wysocki <rafael.j.wysocki@intel.com>
Thu, 1 Dec 2016 13:28:22 +0000 (14:28 +0100)
ACPICA commit 80e24663b212daac0c32767fdbd8a46892292f1f

This patch introduces acpi_tb_unload_table() to eliminate redundant code from
acpi_ex_unload_table() and acpi_unload_parent_table().

No functional change. Lv Zheng.

Link: https://github.com/acpica/acpica/commit/80e24663
Signed-off-by: Lv Zheng <lv.zheng@intel.com>
Signed-off-by: Bob Moore <robert.moore@intel.com>
Signed-off-by: Rafael J. Wysocki <rafael.j.wysocki@intel.com>
drivers/acpi/acpica/actables.h
drivers/acpi/acpica/exconfig.c
drivers/acpi/acpica/tbdata.c
drivers/acpi/acpica/tbxfload.c

index 1850005c5c7a70a1464d6101494d0596cdc58c9b..7dd527f8ca1d24b10915c865dc3f24e4a8e34b92 100644 (file)
@@ -130,6 +130,8 @@ acpi_status
 acpi_tb_install_and_load_table(acpi_physical_address address,
                               u8 flags, u8 override, u32 *table_index);
 
+acpi_status acpi_tb_unload_table(u32 table_index);
+
 void acpi_tb_terminate(void);
 
 acpi_status acpi_tb_delete_namespace_by_owner(u32 table_index);
index 8b8d620e2656e1782fee9ede577ffc376dabf34f..c32c7829878a86719181ec025292c1f97f5a8621 100644 (file)
@@ -499,7 +499,6 @@ acpi_status acpi_ex_unload_table(union acpi_operand_object *ddb_handle)
        acpi_status status = AE_OK;
        union acpi_operand_object *table_desc = ddb_handle;
        u32 table_index;
-       struct acpi_table_header *table;
 
        ACPI_FUNCTION_TRACE(ex_unload_table);
 
@@ -536,39 +535,7 @@ acpi_status acpi_ex_unload_table(union acpi_operand_object *ddb_handle)
         * strict order requirement against it.
         */
        acpi_ex_exit_interpreter();
-
-       /* Ensure the table is still loaded */
-
-       if (!acpi_tb_is_table_loaded(table_index)) {
-               status = AE_NOT_EXIST;
-               goto lock_and_exit;
-       }
-
-       /* Invoke table handler if present */
-
-       if (acpi_gbl_table_handler) {
-               status = acpi_get_table_by_index(table_index, &table);
-               if (ACPI_SUCCESS(status)) {
-                       (void)acpi_gbl_table_handler(ACPI_TABLE_EVENT_UNLOAD,
-                                                    table,
-                                                    acpi_gbl_table_handler_context);
-               }
-       }
-
-       /* Delete the portion of the namespace owned by this table */
-
-       status = acpi_tb_delete_namespace_by_owner(table_index);
-       if (ACPI_FAILURE(status)) {
-               goto lock_and_exit;
-       }
-
-       (void)acpi_tb_release_owner_id(table_index);
-       acpi_tb_set_table_loaded_flag(table_index, FALSE);
-
-lock_and_exit:
-
-       /* Re-acquire the interpreter lock */
-
+       status = acpi_tb_unload_table(table_index);
        acpi_ex_enter_interpreter();
 
        /*
index 4cbfa30b6c0511c1252d3af47af72aa8205578af..82b0b571097960919ce6ed36a703402422ac3cc7 100644 (file)
@@ -871,3 +871,51 @@ unlock_and_exit:
        (void)acpi_ut_release_mutex(ACPI_MTX_TABLES);
        return_ACPI_STATUS(status);
 }
+
+/*******************************************************************************
+ *
+ * FUNCTION:    acpi_tb_unload_table
+ *
+ * PARAMETERS:  table_index             - Table index
+ *
+ * RETURN:      Status
+ *
+ * DESCRIPTION: Unload an ACPI table
+ *
+ ******************************************************************************/
+
+acpi_status acpi_tb_unload_table(u32 table_index)
+{
+       acpi_status status = AE_OK;
+       struct acpi_table_header *table;
+
+       ACPI_FUNCTION_TRACE(tb_unload_table);
+
+       /* Ensure the table is still loaded */
+
+       if (!acpi_tb_is_table_loaded(table_index)) {
+               return_ACPI_STATUS(AE_NOT_EXIST);
+       }
+
+       /* Invoke table handler if present */
+
+       if (acpi_gbl_table_handler) {
+               status = acpi_get_table_by_index(table_index, &table);
+               if (ACPI_SUCCESS(status)) {
+                       (void)acpi_gbl_table_handler(ACPI_TABLE_EVENT_UNLOAD,
+                                                    table,
+                                                    acpi_gbl_table_handler_context);
+               }
+       }
+
+       /* Delete the portion of the namespace owned by this table */
+
+       status = acpi_tb_delete_namespace_by_owner(table_index);
+       if (ACPI_FAILURE(status)) {
+               return_ACPI_STATUS(status);
+       }
+
+       (void)acpi_tb_release_owner_id(table_index);
+       acpi_tb_set_table_loaded_flag(table_index, FALSE);
+       return_ACPI_STATUS(status);
+}
index 77de33b76c857a2170b6643a8ed133c175c6567f..82019c01a0e58edd7c8382fb9bcf7fadddf4f67b 100644 (file)
@@ -408,37 +408,8 @@ acpi_status acpi_unload_parent_table(acpi_handle object)
                        break;
                }
 
-               /* Ensure the table is actually loaded */
-
                (void)acpi_ut_release_mutex(ACPI_MTX_TABLES);
-               if (!acpi_tb_is_table_loaded(i)) {
-                       status = AE_NOT_EXIST;
-                       (void)acpi_ut_acquire_mutex(ACPI_MTX_TABLES);
-                       break;
-               }
-
-               /* Invoke table handler if present */
-
-               if (acpi_gbl_table_handler) {
-                       (void)acpi_gbl_table_handler(ACPI_TABLE_EVENT_UNLOAD,
-                                                    acpi_gbl_root_table_list.
-                                                    tables[i].pointer,
-                                                    acpi_gbl_table_handler_context);
-               }
-
-               /*
-                * Delete all namespace objects owned by this table. Note that
-                * these objects can appear anywhere in the namespace by virtue
-                * of the AML "Scope" operator. Thus, we need to track ownership
-                * by an ID, not simply a position within the hierarchy.
-                */
-               status = acpi_tb_delete_namespace_by_owner(i);
-               if (ACPI_FAILURE(status)) {
-                       break;
-               }
-
-               status = acpi_tb_release_owner_id(i);
-               acpi_tb_set_table_loaded_flag(i, FALSE);
+               status = acpi_tb_unload_table(i);
                (void)acpi_ut_acquire_mutex(ACPI_MTX_TABLES);
                break;
        }