ACPICA: Performance enhancement for ACPI package objects.
authorChao Guan <chao.guan@intel.com>
Wed, 19 Dec 2012 05:37:53 +0000 (05:37 +0000)
committerRafael J. Wysocki <rafael.j.wysocki@intel.com>
Thu, 10 Jan 2013 11:36:18 +0000 (12:36 +0100)
This change greatly increases the performance of package objects
within the interpreter. It changes the processing of reference
counts for packages by optimizing for the most common case where
the package subobjects are either integers, strings, or buffers.
Increases the performance of the ASLTS test suite by 1.5X.
Chao Guan. ACPICA BZ 943.
https://www.acpica.org/bugzilla/show_bug.cgi?id=943

Signed-off-by: Chao Guan <chao.guan@intel.com>
Signed-off-by: Bob Moore <robert.moore@intel.com>
Signed-off-by: Lv Zheng <lv.zheng@intel.com>
Signed-off-by: Rafael J. Wysocki <rafael.j.wysocki@intel.com>
drivers/acpi/acpica/utdelete.c

index 798105443d0f9c4689d26641ff7d206a63e56f1c..e806fb02187b0f88794e5b3b17053355af390bff 100644 (file)
@@ -530,18 +530,42 @@ acpi_ut_update_object_reference(union acpi_operand_object *object, u16 action)
                         */
                        for (i = 0; i < object->package.count; i++) {
                                /*
-                                * Push each element onto the stack for later processing.
-                                * Note: There can be null elements within the package,
-                                * these are simply ignored
+                                * Null package elements are legal and can be simply
+                                * ignored.
                                 */
-                               status =
-                                   acpi_ut_create_update_state_and_push
-                                   (object->package.elements[i], action,
-                                    &state_list);
-                               if (ACPI_FAILURE(status)) {
-                                       goto error_exit;
+                               next_object = object->package.elements[i];
+                               if (!next_object) {
+                                       continue;
+                               }
+
+                               switch (next_object->common.type) {
+                               case ACPI_TYPE_INTEGER:
+                               case ACPI_TYPE_STRING:
+                               case ACPI_TYPE_BUFFER:
+                                       /*
+                                        * For these very simple sub-objects, we can just
+                                        * update the reference count here and continue.
+                                        * Greatly increases performance of this operation.
+                                        */
+                                       acpi_ut_update_ref_count(next_object,
+                                                                action);
+                                       break;
+
+                               default:
+                                       /*
+                                        * For complex sub-objects, push them onto the stack
+                                        * for later processing (this eliminates recursion.)
+                                        */
+                                       status =
+                                           acpi_ut_create_update_state_and_push
+                                           (next_object, action, &state_list);
+                                       if (ACPI_FAILURE(status)) {
+                                               goto error_exit;
+                                       }
+                                       break;
                                }
                        }
+                       next_object = NULL;
                        break;
 
                case ACPI_TYPE_BUFFER_FIELD: