aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/acpi/acpica/excreate.c
diff options
context:
space:
mode:
authorLin Ming <ming.m.lin@intel.com>2011-01-12 09:19:43 +0800
committerLen Brown <len.brown@intel.com>2011-01-18 23:48:03 -0500
commit262948428878fb340127faca1791acb17146122e (patch)
tree646ebdc7158fcdf889e59185dd58fd764725bc45 /drivers/acpi/acpica/excreate.c
parent672af843abfc9a41c7ec792722e04b6c68a3cfea (diff)
downloadkernel_goldelico_gta04-262948428878fb340127faca1791acb17146122e.tar.gz
kernel_goldelico_gta04-262948428878fb340127faca1791acb17146122e.tar.bz2
kernel_goldelico_gta04-262948428878fb340127faca1791acb17146122e.zip
ACPICA: Fix issues/fault with automatic "serialized" method support
History: This support changes a method to "serialized" on the fly if the method generates an AE_ALREADY_EXISTS error, indicating the possibility that it cannot handle reentrancy. This fix repairs a couple of issues seen in the field, especially on machines with many cores. 1) Delete method children only upon the exit of the last thread, so as to not delete objects out from under running threads. 2) Set the "serialized" bit for the method only upon the exit of the last thread, so as to not cause deadlock when running threads attempt to exit. 3) Cleanup the use of the AML "MethodFlags" and internal method flags so that there is no longer any confustion between the two. Reported-by: Dana Myers <dana.myers@oracle.com> Signed-off-by: Lin Ming <ming.m.lin@intel.com> Signed-off-by: Bob Moore <robert.moore@intel.com> Signed-off-by: Len Brown <len.brown@intel.com>
Diffstat (limited to 'drivers/acpi/acpica/excreate.c')
-rw-r--r--drivers/acpi/acpica/excreate.c8
1 files changed, 4 insertions, 4 deletions
diff --git a/drivers/acpi/acpica/excreate.c b/drivers/acpi/acpica/excreate.c
index 3c61b48c73f..ffac8c7e54c 100644
--- a/drivers/acpi/acpica/excreate.c
+++ b/drivers/acpi/acpica/excreate.c
@@ -482,13 +482,11 @@ acpi_ex_create_method(u8 * aml_start,
obj_desc->method.aml_length = aml_length;
/*
- * Disassemble the method flags. Split off the Arg Count
- * for efficiency
+ * Disassemble the method flags. Split off the arg_count, Serialized
+ * flag, and sync_level for efficiency.
*/
method_flags = (u8) operand[1]->integer.value;
- obj_desc->method.method_flags =
- (u8) (method_flags & ~AML_METHOD_ARG_COUNT);
obj_desc->method.param_count =
(u8) (method_flags & AML_METHOD_ARG_COUNT);
@@ -497,6 +495,8 @@ acpi_ex_create_method(u8 * aml_start,
* created for this method when it is parsed.
*/
if (method_flags & AML_METHOD_SERIALIZED) {
+ obj_desc->method.info_flags = ACPI_METHOD_SERIALIZED;
+
/*
* ACPI 1.0: sync_level = 0
* ACPI 2.0: sync_level = sync_level in method declaration