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: Rafael J. Wysocki <rafael.j.wysocki@intel.com> Tested-by: Mika Westerberg <mika.westerberg@linux.intel.com>
This commit is contained in:
parent
d3a1ebb063
commit
7c2e17714e
2 changed files with 34 additions and 3 deletions
|
@ -923,19 +923,22 @@ ACPI_EXPORT_SYMBOL(acpi_detach_data)
|
|||
|
||||
/*******************************************************************************
|
||||
*
|
||||
* FUNCTION: acpi_get_data
|
||||
* FUNCTION: acpi_get_data_full
|
||||
*
|
||||
* PARAMETERS: obj_handle - Namespace node
|
||||
* handler - Handler used in call to attach_data
|
||||
* data - Where the data is returned
|
||||
* callback - function to execute before returning
|
||||
*
|
||||
* 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_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;
|
||||
acpi_status status;
|
||||
|
@ -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);
|
||||
if (ACPI_SUCCESS(status) && callback) {
|
||||
callback(*data);
|
||||
}
|
||||
|
||||
unlock_and_exit:
|
||||
(void)acpi_ut_release_mutex(ACPI_MTX_NAMESPACE);
|
||||
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)
|
||||
|
|
|
@ -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_get_data_full(acpi_handle object, acpi_object_handler handler, void **data,
|
||||
void (*callback)(void *));
|
||||
|
||||
acpi_status
|
||||
acpi_get_data(acpi_handle object, acpi_object_handler handler, void **data);
|
||||
|
||||
|
|
Loading…
Reference in a new issue