aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/acpi/acpica/dsmethod.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/acpi/acpica/dsmethod.c')
-rw-r--r--drivers/acpi/acpica/dsmethod.c14
1 files changed, 12 insertions, 2 deletions
diff --git a/drivers/acpi/acpica/dsmethod.c b/drivers/acpi/acpica/dsmethod.c
index 47c7b52a519c..32e9ddc0cf2b 100644
--- a/drivers/acpi/acpica/dsmethod.c
+++ b/drivers/acpi/acpica/dsmethod.c
@@ -99,11 +99,14 @@ acpi_ds_auto_serialize_method(struct acpi_namespace_node *node,
99 "Method auto-serialization parse [%4.4s] %p\n", 99 "Method auto-serialization parse [%4.4s] %p\n",
100 acpi_ut_get_node_name(node), node)); 100 acpi_ut_get_node_name(node), node));
101 101
102 acpi_ex_enter_interpreter();
103
102 /* Create/Init a root op for the method parse tree */ 104 /* Create/Init a root op for the method parse tree */
103 105
104 op = acpi_ps_alloc_op(AML_METHOD_OP, obj_desc->method.aml_start); 106 op = acpi_ps_alloc_op(AML_METHOD_OP, obj_desc->method.aml_start);
105 if (!op) { 107 if (!op) {
106 return_ACPI_STATUS(AE_NO_MEMORY); 108 status = AE_NO_MEMORY;
109 goto unlock;
107 } 110 }
108 111
109 acpi_ps_set_name(op, node->name.integer); 112 acpi_ps_set_name(op, node->name.integer);
@@ -115,7 +118,8 @@ acpi_ds_auto_serialize_method(struct acpi_namespace_node *node,
115 acpi_ds_create_walk_state(node->owner_id, NULL, NULL, NULL); 118 acpi_ds_create_walk_state(node->owner_id, NULL, NULL, NULL);
116 if (!walk_state) { 119 if (!walk_state) {
117 acpi_ps_free_op(op); 120 acpi_ps_free_op(op);
118 return_ACPI_STATUS(AE_NO_MEMORY); 121 status = AE_NO_MEMORY;
122 goto unlock;
119 } 123 }
120 124
121 status = acpi_ds_init_aml_walk(walk_state, op, node, 125 status = acpi_ds_init_aml_walk(walk_state, op, node,
@@ -134,6 +138,8 @@ acpi_ds_auto_serialize_method(struct acpi_namespace_node *node,
134 status = acpi_ps_parse_aml(walk_state); 138 status = acpi_ps_parse_aml(walk_state);
135 139
136 acpi_ps_delete_parse_tree(op); 140 acpi_ps_delete_parse_tree(op);
141unlock:
142 acpi_ex_exit_interpreter();
137 return_ACPI_STATUS(status); 143 return_ACPI_STATUS(status);
138} 144}
139 145
@@ -757,8 +763,10 @@ acpi_ds_terminate_control_method(union acpi_operand_object *method_desc,
757 763
758 /* Delete any direct children of (created by) this method */ 764 /* Delete any direct children of (created by) this method */
759 765
766 (void)acpi_ex_exit_interpreter();
760 acpi_ns_delete_namespace_subtree(walk_state-> 767 acpi_ns_delete_namespace_subtree(walk_state->
761 method_node); 768 method_node);
769 (void)acpi_ex_enter_interpreter();
762 770
763 /* 771 /*
764 * Delete any objects that were created by this method 772 * Delete any objects that were created by this method
@@ -769,9 +777,11 @@ acpi_ds_terminate_control_method(union acpi_operand_object *method_desc,
769 */ 777 */
770 if (method_desc->method. 778 if (method_desc->method.
771 info_flags & ACPI_METHOD_MODIFIED_NAMESPACE) { 779 info_flags & ACPI_METHOD_MODIFIED_NAMESPACE) {
780 (void)acpi_ex_exit_interpreter();
772 acpi_ns_delete_namespace_by_owner(method_desc-> 781 acpi_ns_delete_namespace_by_owner(method_desc->
773 method. 782 method.
774 owner_id); 783 owner_id);
784 (void)acpi_ex_enter_interpreter();
775 method_desc->method.info_flags &= 785 method_desc->method.info_flags &=
776 ~ACPI_METHOD_MODIFIED_NAMESPACE; 786 ~ACPI_METHOD_MODIFIED_NAMESPACE;
777 } 787 }