ACPICA: Fix SyncLevel support interaction with method auto-serialization
authorDavid E. Box <david.e.box@linux.intel.com>
Tue, 29 Dec 2015 05:53:57 +0000 (13:53 +0800)
committerRafael J. Wysocki <rafael.j.wysocki@intel.com>
Fri, 1 Jan 2016 02:26:45 +0000 (03:26 +0100)
ACPICA commit 253e3c03efc1a495d2aa61eee09ab1d0842a3dce

The control method auto-serialization can interfere with existing
ASL code that makes use of Mutex/Method SyncLevel support. This
change makes the auto-serialization transparent to the SyncLevel
support and management. David Box.

Link: https://github.com/acpica/acpica/commit/253e3c03
Signed-off-by: David E. Box <david.e.box@linux.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/dsmethod.c

index bc32f3194afe1675bdc767d9f1dbd26a2959b3aa..49ba082ad3799806f4a8c39ac9ce77878bebd86a 100644 (file)
@@ -411,8 +411,19 @@ acpi_ds_begin_method_execution(struct acpi_namespace_node *method_node,
 
                                obj_desc->method.mutex->mutex.thread_id =
                                    walk_state->thread->thread_id;
-                               walk_state->thread->current_sync_level =
-                                   obj_desc->method.sync_level;
+
+                               /*
+                                * Update the current sync_level only if this is not an auto-
+                                * serialized method. In the auto case, we have to ignore
+                                * the sync level for the method mutex (created for the
+                                * auto-serialization) because we have no idea of what the
+                                * sync level should be. Therefore, just ignore it.
+                                */
+                               if (!(obj_desc->method.info_flags &
+                                     ACPI_METHOD_IGNORE_SYNC_LEVEL)) {
+                                       walk_state->thread->current_sync_level =
+                                           obj_desc->method.sync_level;
+                               }
                        } else {
                                obj_desc->method.mutex->mutex.
                                    original_sync_level =