From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1754879AbdEIF5w (ORCPT ); Tue, 9 May 2017 01:57:52 -0400 Received: from mga02.intel.com ([134.134.136.20]:41968 "EHLO mga02.intel.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1754635AbdEIF5v (ORCPT ); Tue, 9 May 2017 01:57:51 -0400 X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.38,312,1491289200"; d="scan'208";a="258702862" From: Lv Zheng To: "Rafael J . Wysocki" , "Rafael J . Wysocki" , Len Brown Cc: Lv Zheng , Lv Zheng , linux-kernel@vger.kernel.org, linux-acpi@vger.kernel.org, Dan Williams Subject: [PATCH v4 2/4] ACPICA: Tables: Add mechanism to allow to balance late stage acpi_get_table() independently Date: Tue, 9 May 2017 13:57:41 +0800 Message-Id: <86628bf775497ed03931e30361bb6115d78876be.1494309338.git.lv.zheng@intel.com> X-Mailer: git-send-email 2.7.4 In-Reply-To: <5361b51c7c257b3216475018a3a5cc4f8b6b21c6.1493281247.git.lv.zheng@intel.com> References: <5361b51c7c257b3216475018a3a5cc4f8b6b21c6.1493281247.git.lv.zheng@intel.com> Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org For all frequent late stage acpi_get_table() clone invocations, we should only change them altogether, otherwise, excessive acpi_put_table() could unexpectedly unmap the table used by the other users. Thus the current plan is to change all acpi_get_table() clones together or to change none of them. However in practical, this is not convenient as this can prevent kernel developers' efforts of improving the late stage code quality before waiting for the ACPICA upstream to improve first. This patch adds a validation count threashold, when it is reached, the validation count can no longer be incremented/decremented to invalidate the table descriptor (means preventing table unmappings) so that acpi_put_table() balance changes can be done independently to each others. Lv Zheng. Cc: Dan Williams Signed-off-by: Lv Zheng --- drivers/acpi/acpica/tbutils.c | 24 +++++++++++++++--------- include/acpi/actbl.h | 9 +++++++++ 2 files changed, 24 insertions(+), 9 deletions(-) diff --git a/drivers/acpi/acpica/tbutils.c b/drivers/acpi/acpica/tbutils.c index 7abe665..04beafc 100644 --- a/drivers/acpi/acpica/tbutils.c +++ b/drivers/acpi/acpica/tbutils.c @@ -416,9 +416,13 @@ acpi_tb_get_table(struct acpi_table_desc *table_desc, } } - table_desc->validation_count++; - if (table_desc->validation_count == 0) { - table_desc->validation_count--; + if (table_desc->validation_count < ACPI_MAX_TABLE_VALIDATIONS) { + table_desc->validation_count++; + if (table_desc->validation_count >= ACPI_MAX_TABLE_VALIDATIONS) { + ACPI_WARNING((AE_INFO, + "Table %p, Validation count overflows\n", + table_desc)); + } } *out_table = table_desc->pointer; @@ -445,13 +449,15 @@ void acpi_tb_put_table(struct acpi_table_desc *table_desc) ACPI_FUNCTION_TRACE(acpi_tb_put_table); - if (table_desc->validation_count == 0) { - ACPI_WARNING((AE_INFO, - "Table %p, Validation count is zero before decrement\n", - table_desc)); - return_VOID; + if (table_desc->validation_count < ACPI_MAX_TABLE_VALIDATIONS) { + table_desc->validation_count--; + if (table_desc->validation_count >= ACPI_MAX_TABLE_VALIDATIONS) { + ACPI_WARNING((AE_INFO, + "Table %p, Validation count underflows\n", + table_desc)); + return_VOID; + } } - table_desc->validation_count--; if (table_desc->validation_count == 0) { diff --git a/include/acpi/actbl.h b/include/acpi/actbl.h index d92543f..8e1bff8 100644 --- a/include/acpi/actbl.h +++ b/include/acpi/actbl.h @@ -374,6 +374,15 @@ struct acpi_table_desc { u16 validation_count; }; +/* + * Maximum validation count, when it is reached, validation count can no + * longer be changed. Which means, the table can no longer be invalidated. + * This mechanism is implemented for backward compatibility, where in OS + * late stage, old drivers are not facilitated with paired validations and + * invalidations. + */ +#define ACPI_MAX_TABLE_VALIDATIONS 5 + /* Masks for Flags field above */ #define ACPI_TABLE_ORIGIN_EXTERNAL_VIRTUAL (0) /* Virtual address, external maintained */ -- 2.7.4