From patchwork Fri Feb 3 13:50:29 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: James Morse X-Patchwork-Id: 52517 Return-Path: Delivered-To: ouuuleilei@gmail.com Received: by 2002:adf:eb09:0:0:0:0:0 with SMTP id s9csp856014wrn; Fri, 3 Feb 2023 06:05:38 -0800 (PST) X-Google-Smtp-Source: AK7set84DAq+2KBNsx9OWs248X4tz1fQF3L5VveAoyRwYRwbsWZIeWZ0nnzod1CgbKz+uFb5FDNx X-Received: by 2002:a17:90b:4b02:b0:22c:43:714f with SMTP id lx2-20020a17090b4b0200b0022c0043714fmr11051814pjb.7.1675433138121; Fri, 03 Feb 2023 06:05:38 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1675433138; cv=none; d=google.com; s=arc-20160816; b=nl4jflIWYSOIv9P9LwH1kCi+lLdlcyEy0mGN6PR0bCRZ4oAhqSQP95XjRhn/mkJMxW /6VtP6ITD/KhktT2T4snSx2kYKTJuAP1iXc33/TVNwytv47wITrrvFpnv8L4qSNukH8t qRkjIgmUtR6TcJ6WjhpFeT9HON68a6yuU8sVxZ/Hef1YiHEumOoMb/DpFf0T3brWtZ1a DRvKRICpwmjf4/wn03peeozZBCQ9x/Tyq5dE/JGNiQ76KfxObEL8cZzrcN0dCBSTYTS3 oV3+BcI0iIZQZVxB2f8NS7Fb5K+2YeM5zLkAnALH1WvaAsWkpfL0C81cF07p0vyXw5L3 dBfQ== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:content-transfer-encoding:mime-version :references:in-reply-to:message-id:date:subject:cc:to:from; bh=c1T+MIJNIjllnDPcJ7ft0WVWncvtF5W94gtB9y0W9y4=; b=RLBmM9fOf25xnNv95Z6Yv2hQNVZysayPjLXXc/OvR922+PvdQQnaBwEk021XDgcIQP mlljTv9qBdFISXZcv7y0s0eJPQaNaWEIfqGnx24CUtclAT3lxrolGCP63Ai2/Ug960lA EnRndopze0d2BVmYM9qc0Ugh0GUMhWFULhvu1uPrvD/bJF51ON9FV9AdeDpxSBh8fbSV 2Ry8jLR3jryuJAKpwwRtkOdBLUznnMRWE4AwXzhI5AQTZlUjOklB/yMrZKJcBUP8kPjz D3RH2oN7rtQ8ytv4jnCPPZoETY5k8PFwCh8H2Csnd8B5R1JF0RaeVgC3579nFj/g2UBp BPDQ== ARC-Authentication-Results: i=1; mx.google.com; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=arm.com Received: from out1.vger.email (out1.vger.email. [2620:137:e000::1:20]) by mx.google.com with ESMTP id i190-20020a6387c7000000b0047798cc3bffsi2986909pge.246.2023.02.03.06.05.24; Fri, 03 Feb 2023 06:05:38 -0800 (PST) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) client-ip=2620:137:e000::1:20; Authentication-Results: mx.google.com; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=arm.com Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S233729AbjBCOEe (ORCPT + 99 others); Fri, 3 Feb 2023 09:04:34 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:49114 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S232835AbjBCOEE (ORCPT ); Fri, 3 Feb 2023 09:04:04 -0500 Received: from foss.arm.com (foss.arm.com [217.140.110.172]) by lindbergh.monkeyblade.net (Postfix) with ESMTP id DCD48A56FC; Fri, 3 Feb 2023 06:01:54 -0800 (PST) Received: from usa-sjc-imap-foss1.foss.arm.com (unknown [10.121.207.14]) by usa-sjc-mx-foss1.foss.arm.com (Postfix) with ESMTP id B5CC61655; Fri, 3 Feb 2023 05:53:51 -0800 (PST) Received: from eglon.cambridge.arm.com (eglon.cambridge.arm.com [10.1.196.177]) by usa-sjc-imap-foss1.foss.arm.com (Postfix) with ESMTPSA id E86E53F71E; Fri, 3 Feb 2023 05:53:05 -0800 (PST) From: James Morse To: linux-pm@vger.kernel.org, loongarch@lists.linux.dev, kvmarm@lists.linux.dev, kvm@vger.kernel.org, linux-acpi@vger.kernel.org, linux-arch@vger.kernel.org, linux-ia64@vger.kernel.org, linux-kernel@vger.kernel.org, linux-arm-kernel@lists.infradead.org, x86@kernel.org Cc: Marc Zyngier , Thomas Gleixner , Lorenzo Pieralisi , Mark Rutland , Sudeep Holla , Borislav Petkov , H Peter Anvin , Dave Hansen , Ingo Molnar , Will Deacon , Catalin Marinas , Huacai Chen , James Morse , Suzuki K Poulose , Oliver Upton , Len Brown , Rafael Wysocki , WANG Xuerui , Salil Mehta , Russell King , Jean-Philippe Brucker Subject: [RFC PATCH 18/32] ACPI: Check _STA present bit before making CPUs not present Date: Fri, 3 Feb 2023 13:50:29 +0000 Message-Id: <20230203135043.409192-19-james.morse@arm.com> X-Mailer: git-send-email 2.30.2 In-Reply-To: <20230203135043.409192-1-james.morse@arm.com> References: <20230203135043.409192-1-james.morse@arm.com> MIME-Version: 1.0 X-Spam-Status: No, score=-4.2 required=5.0 tests=BAYES_00,RCVD_IN_DNSWL_MED, SPF_HELO_NONE,SPF_NONE autolearn=ham autolearn_force=no version=3.4.6 X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on lindbergh.monkeyblade.net Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org X-getmail-retrieved-from-mailbox: =?utf-8?q?INBOX?= X-GMAIL-THRID: =?utf-8?q?1756818978279471510?= X-GMAIL-MSGID: =?utf-8?q?1756818978279471510?= When called acpi_processor_post_eject() unconditionally make a CPU not-present and unregisters it. To add support for AML events where the CPU has become disabled, but remains present, the _STA method should be checked before calling acpi_processor_remove(). Rename acpi_processor_post_eject() acpi_processor_remove_possible(), and check the _STA before calling. Adding the function prototype for arch_unregister_cpu() allows the preprocessor guards to be removed. After this change CPUs will remain registered and visible to user-space as offline if buggy firmware triggers an eject-request, but doesn't clear the corresponding _STA bits after _EJ0 has been called. Signed-off-by: James Morse --- drivers/acpi/acpi_processor.c | 31 +++++++++++++++++++++++++------ include/linux/cpu.h | 1 + 2 files changed, 26 insertions(+), 6 deletions(-) diff --git a/drivers/acpi/acpi_processor.c b/drivers/acpi/acpi_processor.c index ab0f80b83773..e6419b06cb37 100644 --- a/drivers/acpi/acpi_processor.c +++ b/drivers/acpi/acpi_processor.c @@ -409,13 +409,12 @@ static int acpi_processor_add(struct acpi_device *device, return result; } -#ifdef CONFIG_ACPI_HOTPLUG_PRESENT_CPU /* Removal */ -static void acpi_processor_post_eject(struct acpi_device *device) +static void acpi_processor_make_not_present(struct acpi_device *device) { struct acpi_processor *pr; - if (!device || !acpi_driver_data(device)) + if (!IS_ENABLED(CONFIG_ACPI_HOTPLUG_PRESENT_CPU)) return; pr = acpi_driver_data(device); @@ -453,7 +452,29 @@ static void acpi_processor_post_eject(struct acpi_device *device) free_cpumask_var(pr->throttling.shared_cpu_map); kfree(pr); } -#endif /* CONFIG_ACPI_HOTPLUG_PRESENT_CPU */ + +static void acpi_processor_post_eject(struct acpi_device *device) +{ + struct acpi_processor *pr; + unsigned long long sta; + acpi_status status; + + if (!device) + return; + + pr = acpi_driver_data(device); + if (!pr || pr->id >= nr_cpu_ids || invalid_phys_cpuid(pr->phys_id)) + return; + + status = acpi_evaluate_integer(pr->handle, "_STA", NULL, &sta); + if (ACPI_FAILURE(status)) + return; + + if (cpu_present(pr->id) && !(sta & ACPI_STA_DEVICE_PRESENT)) { + acpi_processor_make_not_present(device); + return; + } +} #ifdef CONFIG_X86 static bool acpi_hwp_native_thermal_lvt_set; @@ -522,9 +543,7 @@ static const struct acpi_device_id processor_device_ids[] = { static struct acpi_scan_handler processor_handler = { .ids = processor_device_ids, .attach = acpi_processor_add, -#ifdef CONFIG_ACPI_HOTPLUG_PRESENT_CPU .post_eject = acpi_processor_post_eject, -#endif .hotplug = { .enabled = true, }, diff --git a/include/linux/cpu.h b/include/linux/cpu.h index 86e79e702325..f6f198a3972b 100644 --- a/include/linux/cpu.h +++ b/include/linux/cpu.h @@ -76,6 +76,7 @@ struct device *cpu_device_create(struct device *parent, void *drvdata, const struct attribute_group **groups, const char *fmt, ...); extern int arch_register_cpu(int cpu); +extern void arch_unregister_cpu(int cpu); #ifdef CONFIG_HOTPLUG_CPU extern void unregister_cpu(struct cpu *cpu); extern ssize_t arch_cpu_probe(const char *, size_t);