From patchwork Wed Aug 9 19:12:26 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: tip-bot2 for Thomas Gleixner X-Patchwork-Id: 133455 Return-Path: Delivered-To: ouuuleilei@gmail.com Received: by 2002:a59:c44e:0:b0:3f2:4152:657d with SMTP id w14csp3034343vqr; Wed, 9 Aug 2023 12:47:38 -0700 (PDT) X-Google-Smtp-Source: AGHT+IF1ZQHnjXy9ElXongyUxQRcMmUTiKXpzLM8liXGti8DjmQ31sWoJ4c7KxlHL34kspKHsQFQ X-Received: by 2002:a05:6512:368c:b0:4fb:89e3:5ac6 with SMTP id d12-20020a056512368c00b004fb89e35ac6mr53613lfs.62.1691610458394; Wed, 09 Aug 2023 12:47:38 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1691610458; cv=none; d=google.com; s=arc-20160816; b=SJyzOfHOBk9p8yj04VIdIj3gw9lCVIwQMhoglTUGuXkz3+nN0LDeh5OdQGR/Ifp+QF p7ls7L+Pzdq46mr/5HaVqmMIacmI++JuNsDqHHGM7mKf476LA3R+7k40+4D3Sm78Bsd8 DIVqKNiOP5EE5jgtqk5N17lfwhg9pxysltgUC8JyIqpN30Y86j3WDZRW4gW8/HUB6Rtc 8XCNh0kYKuURTudgcgmz/Pkd671SCMDRIA+MRI0fv2A/lNtr8WG1T6WY9Ebq7AYpLgxU u2t/zu5KWlKCLUIqSLGcQeEfu8It4/jXYVs2ClWel+QRd88e3xCkP7CMhCr651MEoytQ mMhw== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:content-transfer-encoding:robot-unsubscribe :robot-id:message-id:mime-version:cc:subject:to:reply-to:sender:from :dkim-signature:dkim-signature:date; bh=ohkpToT0HtnZg8M0bfPuMudjcjc4A7LmtZzcOqJUuz8=; fh=jBwjuriIPWA1lnCf5oMMiNAPpgGE0iGPmBzZMsd85oQ=; b=Wx7O6xY9RsObDkAcu4trdihC/0+8517M5z/nHxT4DWMt9YrosrWy5z1mrYRF+rHjI0 omLUt60BBN14JIeLbYaV72kmRubbO8q1gAxAvXnhVlu+18vlyXd2p/2UETyIxE5a8UAd R2jVwRMa0d8wWVEKZe+0zNjFSnXKKT+t+jAEqJkUueRBmshUzjvLXbBq9ok65kEsQ2TZ S6aGT7OMG9SGNMlUdMx56+CUEdgOULHsZo7F84OZeEziyRNJmLp3vE3qHnsVaxr43Clo bTmISYgkmCBXJQ7OvGb16Uv5Nz/ClavjJ5ml80D3DAnw246RiyidYtWNR9shFggYgKsm GvJQ== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@linutronix.de header.s=2020 header.b=DlMJOduG; dkim=neutral (no key) header.i=@linutronix.de header.s=2020e header.b=9TouW4VY; 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=pass (p=NONE sp=QUARANTINE dis=NONE) header.from=linutronix.de Received: from out1.vger.email (out1.vger.email. [2620:137:e000::1:20]) by mx.google.com with ESMTP id d4-20020a05640208c400b005231e7a8671si8697038edz.614.2023.08.09.12.47.14; Wed, 09 Aug 2023 12:47:38 -0700 (PDT) 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; dkim=pass header.i=@linutronix.de header.s=2020 header.b=DlMJOduG; dkim=neutral (no key) header.i=@linutronix.de header.s=2020e header.b=9TouW4VY; 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=pass (p=NONE sp=QUARANTINE dis=NONE) header.from=linutronix.de Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S233403AbjHITOV (ORCPT + 99 others); Wed, 9 Aug 2023 15:14:21 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:36432 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S233455AbjHITNi (ORCPT ); Wed, 9 Aug 2023 15:13:38 -0400 Received: from galois.linutronix.de (Galois.linutronix.de [IPv6:2a0a:51c0:0:12e:550::1]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 472D730EF; Wed, 9 Aug 2023 12:12:54 -0700 (PDT) Date: Wed, 09 Aug 2023 19:12:26 -0000 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linutronix.de; s=2020; t=1691608347; h=from:from:sender:sender:reply-to:reply-to:subject:subject:date:date: message-id:message-id:to:to:cc:cc:mime-version:mime-version: content-type:content-type: content-transfer-encoding:content-transfer-encoding; bh=ohkpToT0HtnZg8M0bfPuMudjcjc4A7LmtZzcOqJUuz8=; b=DlMJOduGMyXWbMgY7Ta/63J2We8lAXGX58IM5lhKOkQdp4vKjIN7cOsbHDAzkFWgev21/l d0gKsLpE0WIdedtOSFot36pJaxnd7qe8I5q8cOC1cTY2mN80/HczZYSna8RRAS/f4Kuypo haWTn9xvTIiURj1gx8VGwY8NNmXakVnVgmvN5InCkkwV1uHgYo3M5+5JB/H9TUdfDpm1pb 1VJr8ZBa4pMdQc1QTkVEvXNiVR65RHaC2vEbXn3MBe8jhCaZNeUDzPC9UzWg04nV3rC0+7 SjJ1ezJz4ZGLOBOG760KcfEFOQ1MzyMv4NE0Ugpxk3r77o5ac4L7Igfw8JdPlw== DKIM-Signature: v=1; a=ed25519-sha256; c=relaxed/relaxed; d=linutronix.de; s=2020e; t=1691608347; h=from:from:sender:sender:reply-to:reply-to:subject:subject:date:date: message-id:message-id:to:to:cc:cc:mime-version:mime-version: content-type:content-type: content-transfer-encoding:content-transfer-encoding; bh=ohkpToT0HtnZg8M0bfPuMudjcjc4A7LmtZzcOqJUuz8=; b=9TouW4VY7hID63fezewiF7gbTA1tY4hhGweTBaX+uuEdp9eFZEWHxmRYHnAKlEEJ/JHxvc QIkF5hgHG97HHWBQ== From: "tip-bot2 for Thomas Gleixner" Sender: tip-bot2@linutronix.de Reply-to: linux-kernel@vger.kernel.org To: linux-tip-commits@vger.kernel.org Subject: [tip: x86/apic] x86/apic: Register boot CPU APIC early Cc: Thomas Gleixner , Dave Hansen , "Peter Zijlstra (Intel)" , Michael Kelley , Sohil Mehta , Juergen Gross , x86@kernel.org, linux-kernel@vger.kernel.org MIME-Version: 1.0 Message-ID: <169160834648.27769.1243536155677022854.tip-bot2@tip-bot2> Robot-ID: Robot-Unsubscribe: Contact to get blacklisted from these emails X-Spam-Status: No, score=-2.1 required=5.0 tests=BAYES_00,DKIM_SIGNED, DKIM_VALID,DKIM_VALID_AU,DKIM_VALID_EF,RCVD_IN_DNSWL_BLOCKED, SPF_HELO_NONE,SPF_PASS,URIBL_BLOCKED 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: INBOX X-GMAIL-THRID: 1773768501403408997 X-GMAIL-MSGID: 1773782128087852908 The following commit has been merged into the x86/apic branch of tip: Commit-ID: d63107fa882eadb59a040313510ef8511746efea Gitweb: https://git.kernel.org/tip/d63107fa882eadb59a040313510ef8511746efea Author: Thomas Gleixner AuthorDate: Tue, 08 Aug 2023 15:03:46 -07:00 Committer: Dave Hansen CommitterDate: Wed, 09 Aug 2023 11:58:18 -07:00 x86/apic: Register boot CPU APIC early Register the boot CPU APIC right when the boot CPUs APIC is read from the hardware. No point is doing this on random places and having wild heuristics to save the boot CPU APIC ID slot and CPU number 0 reserved. Signed-off-by: Thomas Gleixner Signed-off-by: Dave Hansen Acked-by: Peter Zijlstra (Intel) Tested-by: Michael Kelley Tested-by: Sohil Mehta Tested-by: Juergen Gross # Xen PV (dom0 and unpriv. guest) --- arch/x86/kernel/apic/apic.c | 120 ++++++++++++++--------------------- 1 file changed, 50 insertions(+), 70 deletions(-) diff --git a/arch/x86/kernel/apic/apic.c b/arch/x86/kernel/apic/apic.c index e26447a..b7ffae4 100644 --- a/arch/x86/kernel/apic/apic.c +++ b/arch/x86/kernel/apic/apic.c @@ -1734,6 +1734,8 @@ void apic_ap_setup(void) end_local_APIC_setup(); } +static __init void cpu_set_boot_apic(void); + static __init void apic_read_boot_cpu_id(bool x2apic) { /* @@ -1748,9 +1750,9 @@ static __init void apic_read_boot_cpu_id(bool x2apic) boot_cpu_physical_apicid = read_apic_id(); boot_cpu_apic_version = GET_APIC_VERSION(apic_read(APIC_LVR)); } + cpu_set_boot_apic(); } - #ifdef CONFIG_X86_X2APIC int x2apic_mode; EXPORT_SYMBOL_GPL(x2apic_mode); @@ -2426,76 +2428,8 @@ static int allocate_logical_cpuid(int apicid) return nr_logical_cpuids++; } -int generic_processor_info(int apicid, int version) +static void cpu_update_apic(int cpu, int apicid, int version) { - int cpu, max = nr_cpu_ids; - bool boot_cpu_detected = physid_isset(boot_cpu_physical_apicid, - phys_cpu_present_map); - - /* - * boot_cpu_physical_apicid is guaranteed to contain the boot CPU - * APIC ID read from the local APIC when this function is invoked. - */ - if (disabled_cpu_apicid != boot_cpu_physical_apicid && - disabled_cpu_apicid == apicid) { - int thiscpu = num_processors + disabled_cpus; - - pr_warn("APIC: Disabling requested cpu. Processor %d/0x%x ignored.\n", - thiscpu, apicid); - - disabled_cpus++; - return -ENODEV; - } - - /* - * If boot cpu has not been detected yet, then only allow upto - * nr_cpu_ids - 1 processors and keep one slot free for boot cpu - */ - if (!boot_cpu_detected && num_processors >= nr_cpu_ids - 1 && - apicid != boot_cpu_physical_apicid) { - int thiscpu = max + disabled_cpus - 1; - - pr_warn("APIC: NR_CPUS/possible_cpus limit of %i almost" - " reached. Keeping one slot for boot cpu." - " Processor %d/0x%x ignored.\n", max, thiscpu, apicid); - - disabled_cpus++; - return -ENODEV; - } - - if (num_processors >= nr_cpu_ids) { - int thiscpu = max + disabled_cpus; - - pr_warn("APIC: NR_CPUS/possible_cpus limit of %i reached. " - "Processor %d/0x%x ignored.\n", max, thiscpu, apicid); - - disabled_cpus++; - return -EINVAL; - } - - if (apicid == boot_cpu_physical_apicid) { - /* - * x86_cpu_to_apicid is required to have processors listed - * in same order as logical cpu numbers. Hence the first - * entry is BSP, and so on. - * boot_cpu_init() already hold bit 0 in cpu_present_mask - * for BSP. - */ - cpu = 0; - - /* Logical cpuid 0 is reserved for BSP. */ - cpuid_to_apicid[0] = apicid; - } else { - cpu = allocate_logical_cpuid(apicid); - if (cpu < 0) { - disabled_cpus++; - return -EINVAL; - } - } - - /* - * Validate version - */ if (version == 0x0) { pr_warn("BIOS bug: APIC version is 0 for CPU %d/0x%x, fixing up to 0x10\n", cpu, apicid); @@ -2521,10 +2455,56 @@ int generic_processor_info(int apicid, int version) if (system_state != SYSTEM_BOOTING) cpu_mark_primary_thread(cpu, apicid); +} + +static __init void cpu_set_boot_apic(void) +{ + cpuid_to_apicid[0] = boot_cpu_physical_apicid; + cpu_update_apic(0, boot_cpu_physical_apicid, boot_cpu_apic_version); +} + +int generic_processor_info(int apicid, int version) +{ + int cpu, max = nr_cpu_ids; + + /* The boot CPU must be set before MADT/MPTABLE parsing happens */ + if (cpuid_to_apicid[0] == BAD_APICID) + panic("Boot CPU APIC not registered yet\n"); + + if (apicid == boot_cpu_physical_apicid) + return 0; + + if (disabled_cpu_apicid == apicid) { + int thiscpu = num_processors + disabled_cpus; + + pr_warn("APIC: Disabling requested cpu. Processor %d/0x%x ignored.\n", + thiscpu, apicid); + disabled_cpus++; + return -ENODEV; + } + + if (num_processors >= nr_cpu_ids) { + int thiscpu = max + disabled_cpus; + + pr_warn("APIC: NR_CPUS/possible_cpus limit of %i reached. " + "Processor %d/0x%x ignored.\n", max, thiscpu, apicid); + + disabled_cpus++; + return -EINVAL; + } + + cpu = allocate_logical_cpuid(apicid); + if (cpu < 0) { + disabled_cpus++; + return -EINVAL; + } + + cpu_update_apic(cpu, apicid, version); return cpu; } + void __irq_msi_compose_msg(struct irq_cfg *cfg, struct msi_msg *msg, bool dmar) {