Commit 7c2e1771 authored by Rafael J. Wysocki's avatar Rafael J. Wysocki

ACPICA: Introduce acpi_get_data_full() and rework acpi_get_data()

Introduce a new function, acpi_get_data_full(), working in analogy
with acpi_get_data() except that it can execute a callback provided
as its 4th argument right after acpi_ns_get_attached_data() has
returned a success.

That will allow Linux to reference count the object pointed to by
*data before the namespace mutex is released so as to ensure that it
will not be freed going forward until the reference to it acquired
by acpi_get_data_full() is dropped.
Signed-off-by: default avatarRafael J. Wysocki <rafael.j.wysocki@intel.com>
Tested-by: default avatarMika Westerberg <mika.westerberg@linux.intel.com>
parent d3a1ebb0
...@@ -923,19 +923,22 @@ ACPI_EXPORT_SYMBOL(acpi_detach_data) ...@@ -923,19 +923,22 @@ ACPI_EXPORT_SYMBOL(acpi_detach_data)
/******************************************************************************* /*******************************************************************************
* *
* FUNCTION: acpi_get_data * FUNCTION: acpi_get_data_full
* *
* PARAMETERS: obj_handle - Namespace node * PARAMETERS: obj_handle - Namespace node
* handler - Handler used in call to attach_data * handler - Handler used in call to attach_data
* data - Where the data is returned * data - Where the data is returned
* callback - function to execute before returning
* *
* RETURN: Status * RETURN: Status
* *
* DESCRIPTION: Retrieve data that was previously attached to a namespace node. * DESCRIPTION: Retrieve data that was previously attached to a namespace node
* and execute a callback before returning.
* *
******************************************************************************/ ******************************************************************************/
acpi_status acpi_status
acpi_get_data(acpi_handle obj_handle, acpi_object_handler handler, void **data) acpi_get_data_full(acpi_handle obj_handle, acpi_object_handler handler,
void **data, void (*callback)(void *))
{ {
struct acpi_namespace_node *node; struct acpi_namespace_node *node;
acpi_status status; acpi_status status;
...@@ -960,10 +963,34 @@ acpi_get_data(acpi_handle obj_handle, acpi_object_handler handler, void **data) ...@@ -960,10 +963,34 @@ acpi_get_data(acpi_handle obj_handle, acpi_object_handler handler, void **data)
} }
status = acpi_ns_get_attached_data(node, handler, data); status = acpi_ns_get_attached_data(node, handler, data);
if (ACPI_SUCCESS(status) && callback) {
callback(*data);
}
unlock_and_exit: unlock_and_exit:
(void)acpi_ut_release_mutex(ACPI_MTX_NAMESPACE); (void)acpi_ut_release_mutex(ACPI_MTX_NAMESPACE);
return (status); return (status);
} }
ACPI_EXPORT_SYMBOL(acpi_get_data_full)
/*******************************************************************************
*
* FUNCTION: acpi_get_data
*
* PARAMETERS: obj_handle - Namespace node
* handler - Handler used in call to attach_data
* data - Where the data is returned
*
* RETURN: Status
*
* DESCRIPTION: Retrieve data that was previously attached to a namespace node.
*
******************************************************************************/
acpi_status
acpi_get_data(acpi_handle obj_handle, acpi_object_handler handler, void **data)
{
return acpi_get_data_full(obj_handle, handler, data, NULL);
}
ACPI_EXPORT_SYMBOL(acpi_get_data) ACPI_EXPORT_SYMBOL(acpi_get_data)
...@@ -229,6 +229,10 @@ acpi_attach_data(acpi_handle object, acpi_object_handler handler, void *data); ...@@ -229,6 +229,10 @@ acpi_attach_data(acpi_handle object, acpi_object_handler handler, void *data);
acpi_status acpi_detach_data(acpi_handle object, acpi_object_handler handler); acpi_status acpi_detach_data(acpi_handle object, acpi_object_handler handler);
acpi_status
acpi_get_data_full(acpi_handle object, acpi_object_handler handler, void **data,
void (*callback)(void *));
acpi_status acpi_status
acpi_get_data(acpi_handle object, acpi_object_handler handler, void **data); acpi_get_data(acpi_handle object, acpi_object_handler handler, void **data);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment