ACPICA: Update for automatic repair code for objects returned by evaluate_object
ACPICA commit 6b58810b9aad7358fbf1a0f4057fefa8d29838d3 This change fixes two instances where the repair code made an incorrect assumption about how reference counts are assigned to package objects. Resolves issues where a warning was issued about a "large reference count" -- which usually indicates an attempt to delete an object that has previously been poisoned and released into the object cache. Link: https://github.com/acpica/acpica/commit/6b58810b 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>hifive-unleashed-5.1
parent
3b2d69114f
commit
ed7f8bc91a
|
@ -290,22 +290,12 @@ object_repaired:
|
||||||
/* Object was successfully repaired */
|
/* Object was successfully repaired */
|
||||||
|
|
||||||
if (package_index != ACPI_NOT_PACKAGE_ELEMENT) {
|
if (package_index != ACPI_NOT_PACKAGE_ELEMENT) {
|
||||||
/*
|
|
||||||
* The original object is a package element. We need to
|
/* Update reference count of new object */
|
||||||
* decrement the reference count of the original object,
|
|
||||||
* for removing it from the package.
|
|
||||||
*
|
|
||||||
* However, if the original object was just wrapped with a
|
|
||||||
* package object as part of the repair, we don't need to
|
|
||||||
* change the reference count.
|
|
||||||
*/
|
|
||||||
if (!(info->return_flags & ACPI_OBJECT_WRAPPED)) {
|
if (!(info->return_flags & ACPI_OBJECT_WRAPPED)) {
|
||||||
new_object->common.reference_count =
|
new_object->common.reference_count =
|
||||||
return_object->common.reference_count;
|
return_object->common.reference_count;
|
||||||
|
|
||||||
if (return_object->common.reference_count > 1) {
|
|
||||||
return_object->common.reference_count--;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
ACPI_DEBUG_PRINT((ACPI_DB_REPAIR,
|
ACPI_DEBUG_PRINT((ACPI_DB_REPAIR,
|
||||||
|
|
|
@ -403,16 +403,12 @@ acpi_ns_repair_CID(struct acpi_evaluate_info *info,
|
||||||
return (status);
|
return (status);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Take care with reference counts */
|
|
||||||
|
|
||||||
if (original_element != *element_ptr) {
|
if (original_element != *element_ptr) {
|
||||||
|
|
||||||
/* Element was replaced */
|
/* Update reference count of new object */
|
||||||
|
|
||||||
(*element_ptr)->common.reference_count =
|
(*element_ptr)->common.reference_count =
|
||||||
original_ref_count;
|
original_ref_count;
|
||||||
|
|
||||||
acpi_ut_remove_reference(original_element);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
element_ptr++;
|
element_ptr++;
|
||||||
|
|
Loading…
Reference in New Issue