ACPICA: Add additional named objects for the auto-serialize method scan.
[cascardo/linux.git] / drivers / acpi / acpica / dsmethod.c
1 /******************************************************************************
2  *
3  * Module Name: dsmethod - Parser/Interpreter interface - control method parsing
4  *
5  *****************************************************************************/
6
7 /*
8  * Copyright (C) 2000 - 2014, Intel Corp.
9  * All rights reserved.
10  *
11  * Redistribution and use in source and binary forms, with or without
12  * modification, are permitted provided that the following conditions
13  * are met:
14  * 1. Redistributions of source code must retain the above copyright
15  *    notice, this list of conditions, and the following disclaimer,
16  *    without modification.
17  * 2. Redistributions in binary form must reproduce at minimum a disclaimer
18  *    substantially similar to the "NO WARRANTY" disclaimer below
19  *    ("Disclaimer") and any redistribution must be conditioned upon
20  *    including a substantially similar Disclaimer requirement for further
21  *    binary redistribution.
22  * 3. Neither the names of the above-listed copyright holders nor the names
23  *    of any contributors may be used to endorse or promote products derived
24  *    from this software without specific prior written permission.
25  *
26  * Alternatively, this software may be distributed under the terms of the
27  * GNU General Public License ("GPL") version 2 as published by the Free
28  * Software Foundation.
29  *
30  * NO WARRANTY
31  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
32  * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
33  * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR
34  * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
35  * HOLDERS OR CONTRIBUTORS BE LIABLE FOR SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
36  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
37  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
38  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
39  * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
40  * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
41  * POSSIBILITY OF SUCH DAMAGES.
42  */
43
44 #include <acpi/acpi.h>
45 #include "accommon.h"
46 #include "acdispat.h"
47 #include "acinterp.h"
48 #include "acnamesp.h"
49 #ifdef  ACPI_DISASSEMBLER
50 #include "acdisasm.h"
51 #endif
52 #include "acparser.h"
53 #include "amlcode.h"
54
55 #define _COMPONENT          ACPI_DISPATCHER
56 ACPI_MODULE_NAME("dsmethod")
57
58 /* Local prototypes */
59 static acpi_status
60 acpi_ds_detect_named_opcodes(struct acpi_walk_state *walk_state,
61                              union acpi_parse_object **out_op);
62
63 static acpi_status
64 acpi_ds_create_method_mutex(union acpi_operand_object *method_desc);
65
66 /*******************************************************************************
67  *
68  * FUNCTION:    acpi_ds_auto_serialize_method
69  *
70  * PARAMETERS:  node                        - Namespace Node of the method
71  *              obj_desc                    - Method object attached to node
72  *
73  * RETURN:      Status
74  *
75  * DESCRIPTION: Parse a control method AML to scan for control methods that
76  *              need serialization due to the creation of named objects.
77  *
78  * NOTE: It is a bit of overkill to mark all such methods serialized, since
79  * there is only a problem if the method actually blocks during execution.
80  * A blocking operation is, for example, a Sleep() operation, or any access
81  * to an operation region. However, it is probably not possible to easily
82  * detect whether a method will block or not, so we simply mark all suspicious
83  * methods as serialized.
84  *
85  * NOTE2: This code is essentially a generic routine for parsing a single
86  * control method.
87  *
88  ******************************************************************************/
89
90 acpi_status
91 acpi_ds_auto_serialize_method(struct acpi_namespace_node *node,
92                               union acpi_operand_object *obj_desc)
93 {
94         acpi_status status;
95         union acpi_parse_object *op = NULL;
96         struct acpi_walk_state *walk_state;
97
98         ACPI_FUNCTION_TRACE_PTR(ds_auto_serialize_method, node);
99
100         ACPI_DEBUG_PRINT((ACPI_DB_PARSE,
101                           "Method auto-serialization parse [%4.4s] %p\n",
102                           acpi_ut_get_node_name(node), node));
103
104         /* Create/Init a root op for the method parse tree */
105
106         op = acpi_ps_alloc_op(AML_METHOD_OP);
107         if (!op) {
108                 return_ACPI_STATUS(AE_NO_MEMORY);
109         }
110
111         acpi_ps_set_name(op, node->name.integer);
112         op->common.node = node;
113
114         /* Create and initialize a new walk state */
115
116         walk_state =
117             acpi_ds_create_walk_state(node->owner_id, NULL, NULL, NULL);
118         if (!walk_state) {
119                 return_ACPI_STATUS(AE_NO_MEMORY);
120         }
121
122         status =
123             acpi_ds_init_aml_walk(walk_state, op, node,
124                                   obj_desc->method.aml_start,
125                                   obj_desc->method.aml_length, NULL, 0);
126         if (ACPI_FAILURE(status)) {
127                 acpi_ds_delete_walk_state(walk_state);
128                 return_ACPI_STATUS(status);
129         }
130
131         walk_state->descending_callback = acpi_ds_detect_named_opcodes;
132
133         /* Parse the method, scan for creation of named objects */
134
135         status = acpi_ps_parse_aml(walk_state);
136         if (ACPI_FAILURE(status)) {
137                 return_ACPI_STATUS(status);
138         }
139
140         acpi_ps_delete_parse_tree(op);
141         return_ACPI_STATUS(status);
142 }
143
144 /*******************************************************************************
145  *
146  * FUNCTION:    acpi_ds_detect_named_opcodes
147  *
148  * PARAMETERS:  walk_state      - Current state of the parse tree walk
149  *              out_op          - Unused, required for parser interface
150  *
151  * RETURN:      Status
152  *
153  * DESCRIPTION: Descending callback used during the loading of ACPI tables.
154  *              Currently used to detect methods that must be marked serialized
155  *              in order to avoid problems with the creation of named objects.
156  *
157  ******************************************************************************/
158
159 static acpi_status
160 acpi_ds_detect_named_opcodes(struct acpi_walk_state *walk_state,
161                              union acpi_parse_object **out_op)
162 {
163
164         ACPI_FUNCTION_NAME(acpi_ds_detect_named_opcodes);
165
166         /* We are only interested in opcodes that create a new name */
167
168         if (!
169             (walk_state->op_info->
170              flags & (AML_NAMED | AML_CREATE | AML_FIELD))) {
171                 return (AE_OK);
172         }
173
174         /*
175          * At this point, we know we have a Named object opcode.
176          * Mark the method as serialized. Later code will create a mutex for
177          * this method to enforce serialization.
178          */
179         walk_state->method_desc->method.info_flags |= ACPI_METHOD_SERIALIZED;
180
181         ACPI_DEBUG_PRINT((ACPI_DB_INFO,
182                           "Method serialized [%4.4s] %p - [%s] (%4.4X)\n",
183                           walk_state->method_node->name.ascii,
184                           walk_state->method_node, walk_state->op_info->name,
185                           walk_state->opcode));
186
187         /* Abort the parse, no need to examine this method any further */
188
189         return (AE_CTRL_TERMINATE);
190 }
191
192 /*******************************************************************************
193  *
194  * FUNCTION:    acpi_ds_method_error
195  *
196  * PARAMETERS:  status          - Execution status
197  *              walk_state      - Current state
198  *
199  * RETURN:      Status
200  *
201  * DESCRIPTION: Called on method error. Invoke the global exception handler if
202  *              present, dump the method data if the disassembler is configured
203  *
204  *              Note: Allows the exception handler to change the status code
205  *
206  ******************************************************************************/
207
208 acpi_status
209 acpi_ds_method_error(acpi_status status, struct acpi_walk_state * walk_state)
210 {
211         ACPI_FUNCTION_ENTRY();
212
213         /* Ignore AE_OK and control exception codes */
214
215         if (ACPI_SUCCESS(status) || (status & AE_CODE_CONTROL)) {
216                 return (status);
217         }
218
219         /* Invoke the global exception handler */
220
221         if (acpi_gbl_exception_handler) {
222
223                 /* Exit the interpreter, allow handler to execute methods */
224
225                 acpi_ex_exit_interpreter();
226
227                 /*
228                  * Handler can map the exception code to anything it wants, including
229                  * AE_OK, in which case the executing method will not be aborted.
230                  */
231                 status = acpi_gbl_exception_handler(status,
232                                                     walk_state->method_node ?
233                                                     walk_state->method_node->
234                                                     name.integer : 0,
235                                                     walk_state->opcode,
236                                                     walk_state->aml_offset,
237                                                     NULL);
238                 acpi_ex_enter_interpreter();
239         }
240
241         acpi_ds_clear_implicit_return(walk_state);
242
243 #ifdef ACPI_DISASSEMBLER
244         if (ACPI_FAILURE(status)) {
245
246                 /* Display method locals/args if disassembler is present */
247
248                 acpi_dm_dump_method_info(status, walk_state, walk_state->op);
249         }
250 #endif
251
252         return (status);
253 }
254
255 /*******************************************************************************
256  *
257  * FUNCTION:    acpi_ds_create_method_mutex
258  *
259  * PARAMETERS:  obj_desc            - The method object
260  *
261  * RETURN:      Status
262  *
263  * DESCRIPTION: Create a mutex object for a serialized control method
264  *
265  ******************************************************************************/
266
267 static acpi_status
268 acpi_ds_create_method_mutex(union acpi_operand_object *method_desc)
269 {
270         union acpi_operand_object *mutex_desc;
271         acpi_status status;
272
273         ACPI_FUNCTION_TRACE(ds_create_method_mutex);
274
275         /* Create the new mutex object */
276
277         mutex_desc = acpi_ut_create_internal_object(ACPI_TYPE_MUTEX);
278         if (!mutex_desc) {
279                 return_ACPI_STATUS(AE_NO_MEMORY);
280         }
281
282         /* Create the actual OS Mutex */
283
284         status = acpi_os_create_mutex(&mutex_desc->mutex.os_mutex);
285         if (ACPI_FAILURE(status)) {
286                 acpi_ut_delete_object_desc(mutex_desc);
287                 return_ACPI_STATUS(status);
288         }
289
290         mutex_desc->mutex.sync_level = method_desc->method.sync_level;
291         method_desc->method.mutex = mutex_desc;
292         return_ACPI_STATUS(AE_OK);
293 }
294
295 /*******************************************************************************
296  *
297  * FUNCTION:    acpi_ds_begin_method_execution
298  *
299  * PARAMETERS:  method_node         - Node of the method
300  *              obj_desc            - The method object
301  *              walk_state          - current state, NULL if not yet executing
302  *                                    a method.
303  *
304  * RETURN:      Status
305  *
306  * DESCRIPTION: Prepare a method for execution. Parses the method if necessary,
307  *              increments the thread count, and waits at the method semaphore
308  *              for clearance to execute.
309  *
310  ******************************************************************************/
311
312 acpi_status
313 acpi_ds_begin_method_execution(struct acpi_namespace_node *method_node,
314                                union acpi_operand_object *obj_desc,
315                                struct acpi_walk_state *walk_state)
316 {
317         acpi_status status = AE_OK;
318
319         ACPI_FUNCTION_TRACE_PTR(ds_begin_method_execution, method_node);
320
321         if (!method_node) {
322                 return_ACPI_STATUS(AE_NULL_ENTRY);
323         }
324
325         /* Prevent wraparound of thread count */
326
327         if (obj_desc->method.thread_count == ACPI_UINT8_MAX) {
328                 ACPI_ERROR((AE_INFO,
329                             "Method reached maximum reentrancy limit (255)"));
330                 return_ACPI_STATUS(AE_AML_METHOD_LIMIT);
331         }
332
333         /*
334          * If this method is serialized, we need to acquire the method mutex.
335          */
336         if (obj_desc->method.info_flags & ACPI_METHOD_SERIALIZED) {
337                 /*
338                  * Create a mutex for the method if it is defined to be Serialized
339                  * and a mutex has not already been created. We defer the mutex creation
340                  * until a method is actually executed, to minimize the object count
341                  */
342                 if (!obj_desc->method.mutex) {
343                         status = acpi_ds_create_method_mutex(obj_desc);
344                         if (ACPI_FAILURE(status)) {
345                                 return_ACPI_STATUS(status);
346                         }
347                 }
348
349                 /*
350                  * The current_sync_level (per-thread) must be less than or equal to
351                  * the sync level of the method. This mechanism provides some
352                  * deadlock prevention
353                  *
354                  * Top-level method invocation has no walk state at this point
355                  */
356                 if (walk_state &&
357                     (walk_state->thread->current_sync_level >
358                      obj_desc->method.mutex->mutex.sync_level)) {
359                         ACPI_ERROR((AE_INFO,
360                                     "Cannot acquire Mutex for method [%4.4s], current SyncLevel is too large (%u)",
361                                     acpi_ut_get_node_name(method_node),
362                                     walk_state->thread->current_sync_level));
363
364                         return_ACPI_STATUS(AE_AML_MUTEX_ORDER);
365                 }
366
367                 /*
368                  * Obtain the method mutex if necessary. Do not acquire mutex for a
369                  * recursive call.
370                  */
371                 if (!walk_state ||
372                     !obj_desc->method.mutex->mutex.thread_id ||
373                     (walk_state->thread->thread_id !=
374                      obj_desc->method.mutex->mutex.thread_id)) {
375                         /*
376                          * Acquire the method mutex. This releases the interpreter if we
377                          * block (and reacquires it before it returns)
378                          */
379                         status =
380                             acpi_ex_system_wait_mutex(obj_desc->method.mutex->
381                                                       mutex.os_mutex,
382                                                       ACPI_WAIT_FOREVER);
383                         if (ACPI_FAILURE(status)) {
384                                 return_ACPI_STATUS(status);
385                         }
386
387                         /* Update the mutex and walk info and save the original sync_level */
388
389                         if (walk_state) {
390                                 obj_desc->method.mutex->mutex.
391                                     original_sync_level =
392                                     walk_state->thread->current_sync_level;
393
394                                 obj_desc->method.mutex->mutex.thread_id =
395                                     walk_state->thread->thread_id;
396                                 walk_state->thread->current_sync_level =
397                                     obj_desc->method.sync_level;
398                         } else {
399                                 obj_desc->method.mutex->mutex.
400                                     original_sync_level =
401                                     obj_desc->method.mutex->mutex.sync_level;
402                         }
403                 }
404
405                 /* Always increase acquisition depth */
406
407                 obj_desc->method.mutex->mutex.acquisition_depth++;
408         }
409
410         /*
411          * Allocate an Owner ID for this method, only if this is the first thread
412          * to begin concurrent execution. We only need one owner_id, even if the
413          * method is invoked recursively.
414          */
415         if (!obj_desc->method.owner_id) {
416                 status = acpi_ut_allocate_owner_id(&obj_desc->method.owner_id);
417                 if (ACPI_FAILURE(status)) {
418                         goto cleanup;
419                 }
420         }
421
422         /*
423          * Increment the method parse tree thread count since it has been
424          * reentered one more time (even if it is the same thread)
425          */
426         obj_desc->method.thread_count++;
427         acpi_method_count++;
428         return_ACPI_STATUS(status);
429
430 cleanup:
431         /* On error, must release the method mutex (if present) */
432
433         if (obj_desc->method.mutex) {
434                 acpi_os_release_mutex(obj_desc->method.mutex->mutex.os_mutex);
435         }
436         return_ACPI_STATUS(status);
437 }
438
439 /*******************************************************************************
440  *
441  * FUNCTION:    acpi_ds_call_control_method
442  *
443  * PARAMETERS:  thread              - Info for this thread
444  *              this_walk_state     - Current walk state
445  *              op                  - Current Op to be walked
446  *
447  * RETURN:      Status
448  *
449  * DESCRIPTION: Transfer execution to a called control method
450  *
451  ******************************************************************************/
452
453 acpi_status
454 acpi_ds_call_control_method(struct acpi_thread_state *thread,
455                             struct acpi_walk_state *this_walk_state,
456                             union acpi_parse_object *op)
457 {
458         acpi_status status;
459         struct acpi_namespace_node *method_node;
460         struct acpi_walk_state *next_walk_state = NULL;
461         union acpi_operand_object *obj_desc;
462         struct acpi_evaluate_info *info;
463         u32 i;
464
465         ACPI_FUNCTION_TRACE_PTR(ds_call_control_method, this_walk_state);
466
467         ACPI_DEBUG_PRINT((ACPI_DB_DISPATCH,
468                           "Calling method %p, currentstate=%p\n",
469                           this_walk_state->prev_op, this_walk_state));
470
471         /*
472          * Get the namespace entry for the control method we are about to call
473          */
474         method_node = this_walk_state->method_call_node;
475         if (!method_node) {
476                 return_ACPI_STATUS(AE_NULL_ENTRY);
477         }
478
479         obj_desc = acpi_ns_get_attached_object(method_node);
480         if (!obj_desc) {
481                 return_ACPI_STATUS(AE_NULL_OBJECT);
482         }
483
484         /* Init for new method, possibly wait on method mutex */
485
486         status = acpi_ds_begin_method_execution(method_node, obj_desc,
487                                                 this_walk_state);
488         if (ACPI_FAILURE(status)) {
489                 return_ACPI_STATUS(status);
490         }
491
492         /* Begin method parse/execution. Create a new walk state */
493
494         next_walk_state = acpi_ds_create_walk_state(obj_desc->method.owner_id,
495                                                     NULL, obj_desc, thread);
496         if (!next_walk_state) {
497                 status = AE_NO_MEMORY;
498                 goto cleanup;
499         }
500
501         /*
502          * The resolved arguments were put on the previous walk state's operand
503          * stack. Operands on the previous walk state stack always
504          * start at index 0. Also, null terminate the list of arguments
505          */
506         this_walk_state->operands[this_walk_state->num_operands] = NULL;
507
508         /*
509          * Allocate and initialize the evaluation information block
510          * TBD: this is somewhat inefficient, should change interface to
511          * ds_init_aml_walk. For now, keeps this struct off the CPU stack
512          */
513         info = ACPI_ALLOCATE_ZEROED(sizeof(struct acpi_evaluate_info));
514         if (!info) {
515                 status = AE_NO_MEMORY;
516                 goto cleanup;
517         }
518
519         info->parameters = &this_walk_state->operands[0];
520
521         status = acpi_ds_init_aml_walk(next_walk_state, NULL, method_node,
522                                        obj_desc->method.aml_start,
523                                        obj_desc->method.aml_length, info,
524                                        ACPI_IMODE_EXECUTE);
525
526         ACPI_FREE(info);
527         if (ACPI_FAILURE(status)) {
528                 goto cleanup;
529         }
530
531         /*
532          * Delete the operands on the previous walkstate operand stack
533          * (they were copied to new objects)
534          */
535         for (i = 0; i < obj_desc->method.param_count; i++) {
536                 acpi_ut_remove_reference(this_walk_state->operands[i]);
537                 this_walk_state->operands[i] = NULL;
538         }
539
540         /* Clear the operand stack */
541
542         this_walk_state->num_operands = 0;
543
544         ACPI_DEBUG_PRINT((ACPI_DB_DISPATCH,
545                           "**** Begin nested execution of [%4.4s] **** WalkState=%p\n",
546                           method_node->name.ascii, next_walk_state));
547
548         /* Invoke an internal method if necessary */
549
550         if (obj_desc->method.info_flags & ACPI_METHOD_INTERNAL_ONLY) {
551                 status =
552                     obj_desc->method.dispatch.implementation(next_walk_state);
553                 if (status == AE_OK) {
554                         status = AE_CTRL_TERMINATE;
555                 }
556         }
557
558         return_ACPI_STATUS(status);
559
560 cleanup:
561
562         /* On error, we must terminate the method properly */
563
564         acpi_ds_terminate_control_method(obj_desc, next_walk_state);
565         if (next_walk_state) {
566                 acpi_ds_delete_walk_state(next_walk_state);
567         }
568
569         return_ACPI_STATUS(status);
570 }
571
572 /*******************************************************************************
573  *
574  * FUNCTION:    acpi_ds_restart_control_method
575  *
576  * PARAMETERS:  walk_state          - State for preempted method (caller)
577  *              return_desc         - Return value from the called method
578  *
579  * RETURN:      Status
580  *
581  * DESCRIPTION: Restart a method that was preempted by another (nested) method
582  *              invocation. Handle the return value (if any) from the callee.
583  *
584  ******************************************************************************/
585
586 acpi_status
587 acpi_ds_restart_control_method(struct acpi_walk_state *walk_state,
588                                union acpi_operand_object *return_desc)
589 {
590         acpi_status status;
591         int same_as_implicit_return;
592
593         ACPI_FUNCTION_TRACE_PTR(ds_restart_control_method, walk_state);
594
595         ACPI_DEBUG_PRINT((ACPI_DB_DISPATCH,
596                           "****Restart [%4.4s] Op %p ReturnValueFromCallee %p\n",
597                           acpi_ut_get_node_name(walk_state->method_node),
598                           walk_state->method_call_op, return_desc));
599
600         ACPI_DEBUG_PRINT((ACPI_DB_DISPATCH,
601                           "    ReturnFromThisMethodUsed?=%X ResStack %p Walk %p\n",
602                           walk_state->return_used,
603                           walk_state->results, walk_state));
604
605         /* Did the called method return a value? */
606
607         if (return_desc) {
608
609                 /* Is the implicit return object the same as the return desc? */
610
611                 same_as_implicit_return =
612                     (walk_state->implicit_return_obj == return_desc);
613
614                 /* Are we actually going to use the return value? */
615
616                 if (walk_state->return_used) {
617
618                         /* Save the return value from the previous method */
619
620                         status = acpi_ds_result_push(return_desc, walk_state);
621                         if (ACPI_FAILURE(status)) {
622                                 acpi_ut_remove_reference(return_desc);
623                                 return_ACPI_STATUS(status);
624                         }
625
626                         /*
627                          * Save as THIS method's return value in case it is returned
628                          * immediately to yet another method
629                          */
630                         walk_state->return_desc = return_desc;
631                 }
632
633                 /*
634                  * The following code is the optional support for the so-called
635                  * "implicit return". Some AML code assumes that the last value of the
636                  * method is "implicitly" returned to the caller, in the absence of an
637                  * explicit return value.
638                  *
639                  * Just save the last result of the method as the return value.
640                  *
641                  * NOTE: this is optional because the ASL language does not actually
642                  * support this behavior.
643                  */
644                 else if (!acpi_ds_do_implicit_return
645                          (return_desc, walk_state, FALSE)
646                          || same_as_implicit_return) {
647                         /*
648                          * Delete the return value if it will not be used by the
649                          * calling method or remove one reference if the explicit return
650                          * is the same as the implicit return value.
651                          */
652                         acpi_ut_remove_reference(return_desc);
653                 }
654         }
655
656         return_ACPI_STATUS(AE_OK);
657 }
658
659 /*******************************************************************************
660  *
661  * FUNCTION:    acpi_ds_terminate_control_method
662  *
663  * PARAMETERS:  method_desc         - Method object
664  *              walk_state          - State associated with the method
665  *
666  * RETURN:      None
667  *
668  * DESCRIPTION: Terminate a control method. Delete everything that the method
669  *              created, delete all locals and arguments, and delete the parse
670  *              tree if requested.
671  *
672  * MUTEX:       Interpreter is locked
673  *
674  ******************************************************************************/
675
676 void
677 acpi_ds_terminate_control_method(union acpi_operand_object *method_desc,
678                                  struct acpi_walk_state *walk_state)
679 {
680
681         ACPI_FUNCTION_TRACE_PTR(ds_terminate_control_method, walk_state);
682
683         /* method_desc is required, walk_state is optional */
684
685         if (!method_desc) {
686                 return_VOID;
687         }
688
689         if (walk_state) {
690
691                 /* Delete all arguments and locals */
692
693                 acpi_ds_method_data_delete_all(walk_state);
694
695                 /*
696                  * If method is serialized, release the mutex and restore the
697                  * current sync level for this thread
698                  */
699                 if (method_desc->method.mutex) {
700
701                         /* Acquisition Depth handles recursive calls */
702
703                         method_desc->method.mutex->mutex.acquisition_depth--;
704                         if (!method_desc->method.mutex->mutex.acquisition_depth) {
705                                 walk_state->thread->current_sync_level =
706                                     method_desc->method.mutex->mutex.
707                                     original_sync_level;
708
709                                 acpi_os_release_mutex(method_desc->method.
710                                                       mutex->mutex.os_mutex);
711                                 method_desc->method.mutex->mutex.thread_id = 0;
712                         }
713                 }
714
715                 /*
716                  * Delete any namespace objects created anywhere within the
717                  * namespace by the execution of this method. Unless:
718                  * 1) This method is a module-level executable code method, in which
719                  *    case we want make the objects permanent.
720                  * 2) There are other threads executing the method, in which case we
721                  *    will wait until the last thread has completed.
722                  */
723                 if (!(method_desc->method.info_flags & ACPI_METHOD_MODULE_LEVEL)
724                     && (method_desc->method.thread_count == 1)) {
725
726                         /* Delete any direct children of (created by) this method */
727
728                         acpi_ns_delete_namespace_subtree(walk_state->
729                                                          method_node);
730
731                         /*
732                          * Delete any objects that were created by this method
733                          * elsewhere in the namespace (if any were created).
734                          * Use of the ACPI_METHOD_MODIFIED_NAMESPACE optimizes the
735                          * deletion such that we don't have to perform an entire
736                          * namespace walk for every control method execution.
737                          */
738                         if (method_desc->method.
739                             info_flags & ACPI_METHOD_MODIFIED_NAMESPACE) {
740                                 acpi_ns_delete_namespace_by_owner(method_desc->
741                                                                   method.
742                                                                   owner_id);
743                                 method_desc->method.info_flags &=
744                                     ~ACPI_METHOD_MODIFIED_NAMESPACE;
745                         }
746                 }
747         }
748
749         /* Decrement the thread count on the method */
750
751         if (method_desc->method.thread_count) {
752                 method_desc->method.thread_count--;
753         } else {
754                 ACPI_ERROR((AE_INFO, "Invalid zero thread count in method"));
755         }
756
757         /* Are there any other threads currently executing this method? */
758
759         if (method_desc->method.thread_count) {
760                 /*
761                  * Additional threads. Do not release the owner_id in this case,
762                  * we immediately reuse it for the next thread executing this method
763                  */
764                 ACPI_DEBUG_PRINT((ACPI_DB_DISPATCH,
765                                   "*** Completed execution of one thread, %u threads remaining\n",
766                                   method_desc->method.thread_count));
767         } else {
768                 /* This is the only executing thread for this method */
769
770                 /*
771                  * Support to dynamically change a method from not_serialized to
772                  * Serialized if it appears that the method is incorrectly written and
773                  * does not support multiple thread execution. The best example of this
774                  * is if such a method creates namespace objects and blocks. A second
775                  * thread will fail with an AE_ALREADY_EXISTS exception.
776                  *
777                  * This code is here because we must wait until the last thread exits
778                  * before marking the method as serialized.
779                  */
780                 if (method_desc->method.
781                     info_flags & ACPI_METHOD_SERIALIZED_PENDING) {
782                         if (walk_state) {
783                                 ACPI_INFO((AE_INFO,
784                                            "Marking method %4.4s as Serialized because of AE_ALREADY_EXISTS error",
785                                            walk_state->method_node->name.
786                                            ascii));
787                         }
788
789                         /*
790                          * Method tried to create an object twice and was marked as
791                          * "pending serialized". The probable cause is that the method
792                          * cannot handle reentrancy.
793                          *
794                          * The method was created as not_serialized, but it tried to create
795                          * a named object and then blocked, causing the second thread
796                          * entrance to begin and then fail. Workaround this problem by
797                          * marking the method permanently as Serialized when the last
798                          * thread exits here.
799                          */
800                         method_desc->method.info_flags &=
801                             ~ACPI_METHOD_SERIALIZED_PENDING;
802                         method_desc->method.info_flags |=
803                             ACPI_METHOD_SERIALIZED;
804                         method_desc->method.sync_level = 0;
805                 }
806
807                 /* No more threads, we can free the owner_id */
808
809                 if (!
810                     (method_desc->method.
811                      info_flags & ACPI_METHOD_MODULE_LEVEL)) {
812                         acpi_ut_release_owner_id(&method_desc->method.owner_id);
813                 }
814         }
815
816         return_VOID;
817 }