ACPICA: Re-implement interpreters' "serialized mode"
Enhanced the implementation of the interpreters' serialized mode (boot with "acpi_serialize" to set acpi_glb_all_methods_serialized flag.) When this mode is specified, instead of creating a serialization semaphore per control method, the interpreter lock is simply no longer released before a blocking operation during control method execution. This effectively makes the AML Interpreter single-threaded. The overhead of a semaphore per-method is eliminated. Signed-off-by: Alexey Starikovskiy <alexey.y.starikovskiy@intel.com> Signed-off-by: Len Brown <len.brown@intel.com>
This commit is contained in:
@@ -154,11 +154,7 @@ acpi_status acpi_ns_evaluate(struct acpi_evaluate_info *info)
|
||||
* Execute the method via the interpreter. The interpreter is locked
|
||||
* here before calling into the AML parser
|
||||
*/
|
||||
status = acpi_ex_enter_interpreter();
|
||||
if (ACPI_FAILURE(status)) {
|
||||
return_ACPI_STATUS(status);
|
||||
}
|
||||
|
||||
acpi_ex_enter_interpreter();
|
||||
status = acpi_ps_execute_method(info);
|
||||
acpi_ex_exit_interpreter();
|
||||
} else {
|
||||
@@ -182,10 +178,7 @@ acpi_status acpi_ns_evaluate(struct acpi_evaluate_info *info)
|
||||
* resolution, we must lock it because we could access an opregion.
|
||||
* The opregion access code assumes that the interpreter is locked.
|
||||
*/
|
||||
status = acpi_ex_enter_interpreter();
|
||||
if (ACPI_FAILURE(status)) {
|
||||
return_ACPI_STATUS(status);
|
||||
}
|
||||
acpi_ex_enter_interpreter();
|
||||
|
||||
/* Function has a strange interface */
|
||||
|
||||
|
@@ -213,7 +213,7 @@ acpi_ns_init_one_object(acpi_handle obj_handle,
|
||||
u32 level, void *context, void **return_value)
|
||||
{
|
||||
acpi_object_type type;
|
||||
acpi_status status;
|
||||
acpi_status status = AE_OK;
|
||||
struct acpi_init_walk_info *info =
|
||||
(struct acpi_init_walk_info *)context;
|
||||
struct acpi_namespace_node *node =
|
||||
@@ -267,10 +267,7 @@ acpi_ns_init_one_object(acpi_handle obj_handle,
|
||||
/*
|
||||
* Must lock the interpreter before executing AML code
|
||||
*/
|
||||
status = acpi_ex_enter_interpreter();
|
||||
if (ACPI_FAILURE(status)) {
|
||||
return (status);
|
||||
}
|
||||
acpi_ex_enter_interpreter();
|
||||
|
||||
/*
|
||||
* Each of these types can contain executable AML code within the
|
||||
|
@@ -170,7 +170,6 @@ acpi_evaluate_object(acpi_handle handle,
|
||||
struct acpi_buffer *return_buffer)
|
||||
{
|
||||
acpi_status status;
|
||||
acpi_status status2;
|
||||
struct acpi_evaluate_info *info;
|
||||
acpi_size buffer_space_needed;
|
||||
u32 i;
|
||||
@@ -329,14 +328,12 @@ acpi_evaluate_object(acpi_handle handle,
|
||||
* Delete the internal return object. NOTE: Interpreter must be
|
||||
* locked to avoid race condition.
|
||||
*/
|
||||
status2 = acpi_ex_enter_interpreter();
|
||||
if (ACPI_SUCCESS(status2)) {
|
||||
acpi_ex_enter_interpreter();
|
||||
|
||||
/* Remove one reference on the return object (should delete it) */
|
||||
/* Remove one reference on the return object (should delete it) */
|
||||
|
||||
acpi_ut_remove_reference(info->return_object);
|
||||
acpi_ex_exit_interpreter();
|
||||
}
|
||||
acpi_ut_remove_reference(info->return_object);
|
||||
acpi_ex_exit_interpreter();
|
||||
}
|
||||
|
||||
cleanup:
|
||||
|
Reference in New Issue
Block a user