From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S932985AbcGGBxK (ORCPT ); Wed, 6 Jul 2016 21:53:10 -0400 Received: from mga01.intel.com ([192.55.52.88]:38597 "EHLO mga01.intel.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1751665AbcGGBxJ (ORCPT ); Wed, 6 Jul 2016 21:53:09 -0400 X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.28,322,1464678000"; d="scan'208";a="990441575" From: Lv Zheng To: "Rafael J. Wysocki" , "Rafael J. Wysocki" , Len Brown Cc: Lv Zheng , Lv Zheng , , linux-acpi@vger.kernel.org, Wolfram Sang , Nicholas Subject: [RFC PATCH] ACPI / EC: Fix an order issue in ec_remove_handlers() Date: Thu, 7 Jul 2016 09:49:28 +0800 Message-Id: <4497ad5c9ab1bc4e35771d149bd1d9a658d28ddf.1467856011.git.lv.zheng@intel.com> X-Mailer: git-send-email 1.7.10 In-Reply-To: <20160706141410.GA1430@tetsubishi> References: <20160706141410.GA1430@tetsubishi> Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org There is an order issue in ec_remove_handlers() that the functions invoked in it are not invoked in the reversed order of their appearance in ec_install_handlers(). This existing issue has been triggered by the following commit: Commit: dcf15cbded656a12335bc4151f3f75f10080a375 Subject: ACPI / EC: Fix a boot EC regresion by restoring boot EC The commit invokes ec_remove_handlers() during runtime, thus uncovers this issue. This patch fixes this regression. Fixes: dcf15cbded65 ("ACPI / EC: Fix a boot EC regresion by restoring boot EC") Link: https://bugzilla.kernel.org/show_bug.cgi?id=102421 Reported-by: Wolfram Sang Reported-by: Nicholas Cc: Wolfram Sang Cc: Nicholas Signed-off-by: Lv Zheng --- drivers/acpi/ec.c | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/drivers/acpi/ec.c b/drivers/acpi/ec.c index b1050a0..9ff3d4b 100644 --- a/drivers/acpi/ec.c +++ b/drivers/acpi/ec.c @@ -1331,7 +1331,12 @@ static int ec_install_handlers(struct acpi_ec *ec) static void ec_remove_handlers(struct acpi_ec *ec) { - acpi_ec_stop(ec, false); + if (test_bit(EC_FLAGS_GPE_HANDLER_INSTALLED, &ec->flags)) { + if (ACPI_FAILURE(acpi_remove_gpe_handler(NULL, ec->gpe, + &acpi_ec_gpe_handler))) + pr_err("failed to remove gpe handler\n"); + clear_bit(EC_FLAGS_GPE_HANDLER_INSTALLED, &ec->flags); + } if (test_bit(EC_FLAGS_EC_HANDLER_INSTALLED, &ec->flags)) { if (ACPI_FAILURE(acpi_remove_address_space_handler(ec->handle, @@ -1340,12 +1345,7 @@ static void ec_remove_handlers(struct acpi_ec *ec) clear_bit(EC_FLAGS_EC_HANDLER_INSTALLED, &ec->flags); } - if (test_bit(EC_FLAGS_GPE_HANDLER_INSTALLED, &ec->flags)) { - if (ACPI_FAILURE(acpi_remove_gpe_handler(NULL, ec->gpe, - &acpi_ec_gpe_handler))) - pr_err("failed to remove gpe handler\n"); - clear_bit(EC_FLAGS_GPE_HANDLER_INSTALLED, &ec->flags); - } + acpi_ec_stop(ec, false); } static struct acpi_ec *acpi_ec_alloc(void) -- 1.7.10