Received: by 2002:ac0:a5b6:0:0:0:0:0 with SMTP id m51-v6csp2130170imm; Mon, 28 May 2018 02:10:30 -0700 (PDT) X-Google-Smtp-Source: AB8JxZrY11VmStCHqv49+V92Hq4oTSVk6vD8+k6LHQhLGQ/LjBA+0/gP+26DFTnImU6aoI7ylayH X-Received: by 2002:a62:3d54:: with SMTP id k81-v6mr12677424pfa.193.1527498630551; Mon, 28 May 2018 02:10:30 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1527498630; cv=none; d=google.com; s=arc-20160816; b=j2WsgJ+wb1mEmowhsFRf3+0SXTRM75wFu+v3K3IvqMlktnOFxWPVjhgCPAynUmFFA6 jOsQtlMYXF/h8fdujrWK73UDjy7OO6/c8Q7vU3Z8tbWj/CinRbg11JGXYU045s5MWnQ0 ZFgTnQ8Xr+p3Oib+5BqLOMU+hCQ42AukTRyW41AVsn8xm4SmP3KGkZzkSOWDke/Yb7gz +xZmfDZC3TF70nu6/azC418hpjgHX5Dr92+I2NVIsPznF9dgepEUhzW33HUNeSt65mlT TWSI0woUy7d4xpgLk37t5JPRS1J3H3UGjJuv5lm/8lMBvYnU6I2/6UDQIsljIeqNDppl 8ofQ== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:mime-version:message-id:date:subject:cc :to:from:arc-authentication-results; bh=qKbZkw4jNCn981Q4xTK3Xm+82Qs5o6rEHn621JyvXUM=; b=Et0j+zqrkbUpNVmbjnC76+sj9gBRCX2sEECXqxNmYktYGJTfOgZUvWQB2HdfLRPVMX OmjBPzYQXNI+vMBabkX2aRt7MwmFMmIhC9OyrF4FRXIRASdP7fC90Ee9QC/FPu1RHUWp R/AizKbgSdPq40uk+BGhmyojNdzjB9gmGiuIXgdrzU70zAcOkUhMaJARILcRxYVQyHgn YigQYzwnOLS59Qj/icyWjqRASmiZ+RVx+mBpBYkIgpjkky0NO5hAAd9Lm9EUr5udardC JXwXuxOsH/i2Y7LiDA1KkCub6oyOqAdy837vz+HwPicXnwKS8h2ynjhw9YO3GB5xoK6j mSfg== ARC-Authentication-Results: i=1; mx.google.com; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id d1-v6si23477192pgo.2.2018.05.28.02.10.15; Mon, 28 May 2018 02:10:30 -0700 (PDT) Received-SPF: pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) client-ip=209.132.180.67; Authentication-Results: mx.google.com; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1754163AbeE1JJR (ORCPT + 99 others); Mon, 28 May 2018 05:09:17 -0400 Received: from mail.cn.fujitsu.com ([183.91.158.132]:60209 "EHLO heian.cn.fujitsu.com" rhost-flags-OK-OK-OK-FAIL) by vger.kernel.org with ESMTP id S1754082AbeE1JJN (ORCPT ); Mon, 28 May 2018 05:09:13 -0400 X-IronPort-AV: E=Sophos;i="5.43,368,1503331200"; d="scan'208";a="40438398" Received: from localhost (HELO cn.fujitsu.com) ([10.167.33.5]) by heian.cn.fujitsu.com with ESMTP; 28 May 2018 17:09:16 +0800 Received: from G08CNEXCHPEKD03.g08.fujitsu.local (unknown [10.167.33.85]) by cn.fujitsu.com (Postfix) with ESMTP id 855BE48AE929; Mon, 28 May 2018 17:09:06 +0800 (CST) Received: from localhost.localdomain (10.167.226.106) by G08CNEXCHPEKD03.g08.fujitsu.local (10.167.33.89) with Microsoft SMTP Server (TLS) id 14.3.399.0; Mon, 28 May 2018 17:09:08 +0800 From: Dou Liyang To: , , CC: , , , , , Dou Liyang Subject: [RESEND RFC PATCH] acpi/processor: Remove the check of duplicate processors Date: Mon, 28 May 2018 17:08:41 +0800 Message-ID: <20180528090841.18185-1-douly.fnst@cn.fujitsu.com> X-Mailer: git-send-email 2.14.3 MIME-Version: 1.0 Content-Type: text/plain X-Originating-IP: [10.167.226.106] X-yoursite-MailScanner-ID: 855BE48AE929.A3ED1 X-yoursite-MailScanner: Found to be clean X-yoursite-MailScanner-From: douly.fnst@cn.fujitsu.com X-Spam-Status: No Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org We found there are some processors which have the same processor ID but in different PXM in the ACPI namespace. such as this: proc_id | pxm -------------------- 0 <-> 0 1 <-> 0 2 <-> 1 3 <-> 1 ...... 89 <-> 0 89 <-> 1 89 <-> 2 89 <-> 3 ...... So we create a mechanism to validate them. make the processor(ID=89) as invalid. And once a processor be hotplugged physically, we check its processor id. Commit 8e089eaa1999 ("acpi: Provide mechanism to validate processors in the ACPI tables") Commit a77d6cd96849 ("acpi/processor: Check for duplicate processor ids at hotplug time") Recently, I found the check mechanism has a bug, it didn't use the acpi_processor_ids_walk() right and always gave us a wrong result. First, I fixed it by modifying the value with AE_OK which is the standard acpi_status value. https://lkml.org/lkml/2018/3/20/273 But, now, I even think this check is useless. my reasons are following: 1). Based on the practical tests, It works well, and no bug be reported 2). Based on the code, the duplicate cases can be dealed with by if (invalid_logical_cpuid(pr->id) || !cpu_present(pr->id)) That seems more reasonable, let's see the following case: Before the patch, After the patch the first processor(ID=89) hot-add failed success the others processor(ID=89) hot-add failed failed So, Remove the check code. Signed-off-by: Dou Liyang Signed-off-by: Dou Liyang --- drivers/acpi/acpi_processor.c | 126 ------------------------------------------ include/linux/acpi.h | 3 - 2 files changed, 129 deletions(-) diff --git a/drivers/acpi/acpi_processor.c b/drivers/acpi/acpi_processor.c index 449d86d39965..8358708e0bbb 100644 --- a/drivers/acpi/acpi_processor.c +++ b/drivers/acpi/acpi_processor.c @@ -281,13 +281,6 @@ static int acpi_processor_get_info(struct acpi_device *device) pr->acpi_id = value; } - if (acpi_duplicate_processor_id(pr->acpi_id)) { - dev_err(&device->dev, - "Failed to get unique processor _UID (0x%x)\n", - pr->acpi_id); - return -ENODEV; - } - pr->phys_id = acpi_get_phys_id(pr->handle, device_declaration, pr->acpi_id); if (invalid_phys_cpuid(pr->phys_id)) @@ -579,127 +572,8 @@ static struct acpi_scan_handler processor_container_handler = { .attach = acpi_processor_container_attach, }; -/* The number of the unique processor IDs */ -static int nr_unique_ids __initdata; - -/* The number of the duplicate processor IDs */ -static int nr_duplicate_ids; - -/* Used to store the unique processor IDs */ -static int unique_processor_ids[] __initdata = { - [0 ... NR_CPUS - 1] = -1, -}; - -/* Used to store the duplicate processor IDs */ -static int duplicate_processor_ids[] = { - [0 ... NR_CPUS - 1] = -1, -}; - -static void __init processor_validated_ids_update(int proc_id) -{ - int i; - - if (nr_unique_ids == NR_CPUS||nr_duplicate_ids == NR_CPUS) - return; - - /* - * Firstly, compare the proc_id with duplicate IDs, if the proc_id is - * already in the IDs, do nothing. - */ - for (i = 0; i < nr_duplicate_ids; i++) { - if (duplicate_processor_ids[i] == proc_id) - return; - } - - /* - * Secondly, compare the proc_id with unique IDs, if the proc_id is in - * the IDs, put it in the duplicate IDs. - */ - for (i = 0; i < nr_unique_ids; i++) { - if (unique_processor_ids[i] == proc_id) { - duplicate_processor_ids[nr_duplicate_ids] = proc_id; - nr_duplicate_ids++; - return; - } - } - - /* - * Lastly, the proc_id is a unique ID, put it in the unique IDs. - */ - unique_processor_ids[nr_unique_ids] = proc_id; - nr_unique_ids++; -} - -static acpi_status __init acpi_processor_ids_walk(acpi_handle handle, - u32 lvl, - void *context, - void **rv) -{ - acpi_status status; - acpi_object_type acpi_type; - unsigned long long uid; - union acpi_object object = { 0 }; - struct acpi_buffer buffer = { sizeof(union acpi_object), &object }; - - status = acpi_get_type(handle, &acpi_type); - if (ACPI_FAILURE(status)) - return false; - - switch (acpi_type) { - case ACPI_TYPE_PROCESSOR: - status = acpi_evaluate_object(handle, NULL, NULL, &buffer); - if (ACPI_FAILURE(status)) - goto err; - uid = object.processor.proc_id; - break; - - case ACPI_TYPE_DEVICE: - status = acpi_evaluate_integer(handle, "_UID", NULL, &uid); - if (ACPI_FAILURE(status)) - goto err; - break; - default: - goto err; - } - - processor_validated_ids_update(uid); - return true; - -err: - acpi_handle_info(handle, "Invalid processor object\n"); - return false; - -} - -static void __init acpi_processor_check_duplicates(void) -{ - /* check the correctness for all processors in ACPI namespace */ - acpi_walk_namespace(ACPI_TYPE_PROCESSOR, ACPI_ROOT_OBJECT, - ACPI_UINT32_MAX, - acpi_processor_ids_walk, - NULL, NULL, NULL); - acpi_get_devices(ACPI_PROCESSOR_DEVICE_HID, acpi_processor_ids_walk, - NULL, NULL); -} - -bool acpi_duplicate_processor_id(int proc_id) -{ - int i; - - /* - * compare the proc_id with duplicate IDs, if the proc_id is already - * in the duplicate IDs, return true, otherwise, return false. - */ - for (i = 0; i < nr_duplicate_ids; i++) { - if (duplicate_processor_ids[i] == proc_id) - return true; - } - return false; -} - void __init acpi_processor_init(void) { - acpi_processor_check_duplicates(); acpi_scan_add_handler_with_hotplug(&processor_handler, "processor"); acpi_scan_add_handler(&processor_container_handler); } diff --git a/include/linux/acpi.h b/include/linux/acpi.h index 15bfb15c2fa5..068dcfe6768b 100644 --- a/include/linux/acpi.h +++ b/include/linux/acpi.h @@ -285,9 +285,6 @@ static inline bool invalid_phys_cpuid(phys_cpuid_t phys_id) return phys_id == PHYS_CPUID_INVALID; } -/* Validate the processor object's proc_id */ -bool acpi_duplicate_processor_id(int proc_id); - #ifdef CONFIG_ACPI_HOTPLUG_CPU /* Arch dependent functions for cpu hotplug support */ int acpi_map_cpu(acpi_handle handle, phys_cpuid_t physid, u32 acpi_id, -- 2.14.3