| From 4a0703ca2e9d7d7570b80afaff6306e7d334e250 Mon Sep 17 00:00:00 2001 |
| From: Sasha Levin <sashal@kernel.org> |
| Date: Mon, 20 Jul 2020 10:31:20 -0700 |
| Subject: ACPICA: Do not increment operation_region reference counts for field |
| units |
| |
| From: Erik Kaneda <erik.kaneda@intel.com> |
| |
| [ Upstream commit 6a54ebae6d047c988a31f5ac5a64ab5cf83797a2 ] |
| |
| ACPICA commit e17b28cfcc31918d0db9547b6b274b09c413eb70 |
| |
| Object reference counts are used as a part of ACPICA's garbage |
| collection mechanism. This mechanism keeps track of references to |
| heap-allocated structures such as the ACPI operand objects. |
| |
| Recent server firmware has revealed that this reference count can |
| overflow on large servers that declare many field units under the |
| same operation_region. This occurs because each field unit declaration |
| will add a reference count to the source operation_region. |
| |
| This change solves the reference count overflow for operation_regions |
| objects by preventing fieldunits from incrementing their |
| operation_region's reference count. Each operation_region's reference |
| count will not be changed by named objects declared under the Field |
| operator. During namespace deletion, the operation_region namespace |
| node will be deleted and each fieldunit will be deleted without |
| touching the deleted operation_region object. |
| |
| Link: https://github.com/acpica/acpica/commit/e17b28cf |
| Signed-off-by: Erik Kaneda <erik.kaneda@intel.com> |
| Signed-off-by: Bob Moore <robert.moore@intel.com> |
| Signed-off-by: Rafael J. Wysocki <rafael.j.wysocki@intel.com> |
| Signed-off-by: Sasha Levin <sashal@kernel.org> |
| --- |
| drivers/acpi/acpica/exprep.c | 4 ---- |
| drivers/acpi/acpica/utdelete.c | 6 +----- |
| 2 files changed, 1 insertion(+), 9 deletions(-) |
| |
| diff --git a/drivers/acpi/acpica/exprep.c b/drivers/acpi/acpica/exprep.c |
| index a4e306690a21b..4a0f03157e082 100644 |
| --- a/drivers/acpi/acpica/exprep.c |
| +++ b/drivers/acpi/acpica/exprep.c |
| @@ -473,10 +473,6 @@ acpi_status acpi_ex_prep_field_value(struct acpi_create_field_info *info) |
| (u8)access_byte_width; |
| } |
| } |
| - /* An additional reference for the container */ |
| - |
| - acpi_ut_add_reference(obj_desc->field.region_obj); |
| - |
| ACPI_DEBUG_PRINT((ACPI_DB_BFIELD, |
| "RegionField: BitOff %X, Off %X, Gran %X, Region %p\n", |
| obj_desc->field.start_field_bit_offset, |
| diff --git a/drivers/acpi/acpica/utdelete.c b/drivers/acpi/acpica/utdelete.c |
| index c365faf4e6cd4..4c0d4e4341961 100644 |
| --- a/drivers/acpi/acpica/utdelete.c |
| +++ b/drivers/acpi/acpica/utdelete.c |
| @@ -568,11 +568,6 @@ acpi_ut_update_object_reference(union acpi_operand_object *object, u16 action) |
| next_object = object->buffer_field.buffer_obj; |
| break; |
| |
| - case ACPI_TYPE_LOCAL_REGION_FIELD: |
| - |
| - next_object = object->field.region_obj; |
| - break; |
| - |
| case ACPI_TYPE_LOCAL_BANK_FIELD: |
| |
| next_object = object->bank_field.bank_obj; |
| @@ -613,6 +608,7 @@ acpi_ut_update_object_reference(union acpi_operand_object *object, u16 action) |
| } |
| break; |
| |
| + case ACPI_TYPE_LOCAL_REGION_FIELD: |
| case ACPI_TYPE_REGION: |
| default: |
| |
| -- |
| 2.25.1 |
| |