summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorChao Guan <chao.guan@intel.com>2012-12-19 05:37:53 +0000
committerRafael J. Wysocki <rafael.j.wysocki@intel.com>2013-01-10 12:36:18 +0100
commit53938551c827d2016912ae5a431a7dad76c2426a (patch)
tree2cbb8cfde2453d891ee21367ac449acc7e53925c
parent227158211e8eba104a477c9a263797256811f206 (diff)
downloadlinux-3.10-53938551c827d2016912ae5a431a7dad76c2426a.tar.gz
linux-3.10-53938551c827d2016912ae5a431a7dad76c2426a.tar.bz2
linux-3.10-53938551c827d2016912ae5a431a7dad76c2426a.zip
ACPICA: Performance enhancement for ACPI package objects.
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>
-rw-r--r--drivers/acpi/acpica/utdelete.c42
1 files changed, 33 insertions, 9 deletions
diff --git a/drivers/acpi/acpica/utdelete.c b/drivers/acpi/acpica/utdelete.c
index 798105443d0..e806fb02187 100644
--- a/drivers/acpi/acpica/utdelete.c
+++ b/drivers/acpi/acpica/utdelete.c
@@ -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: