From patchwork Mon Jul 17 23:14:49 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Thomas Gleixner X-Patchwork-Id: 121646 Return-Path: Delivered-To: ouuuleilei@gmail.com Received: by 2002:a59:c923:0:b0:3e4:2afc:c1 with SMTP id j3csp1399302vqt; Mon, 17 Jul 2023 16:17:52 -0700 (PDT) X-Google-Smtp-Source: APBJJlHH5oTsiL4TnMxodIAX7QBu1eknIOHPIpejD19aO0IMOz15sQPC5+zxyMEL9hX5vUQ547AP X-Received: by 2002:a19:6743:0:b0:4ed:cc6d:61fe with SMTP id e3-20020a196743000000b004edcc6d61femr447424lfj.24.1689635872359; Mon, 17 Jul 2023 16:17:52 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1689635872; cv=none; d=google.com; s=arc-20160816; b=QaiLu5n7nmfDWAdDqNJVT0kr8m2Qt9fxx3af7LHnZo/9NJOkWAOx7iNulMnRXQkbM6 8mCcmJLQOBKTMMqLNxdUx2a1rdCzJggrVigdyxDo9E3Ed3vuK7A4G7HMYU1TrqGDGKTB 66Q/I3Pl3Z0D+BQvcjh3V5DrH5HPvLCIxvm0+ugS8KBI4W24KggSeLVQKR5uVxxK/7Qo AnTYj2ucQ6bPzWDFcwluwrkVTgMFkM9tcNViggbzbeuDPSkvYWTFIhj2jn/YHC92Nby9 iU07Tb39h8xfogQun5W+AwgbaIWXBKensWR+kvOLi786BoIleSM7QgrnFQnuY/6/YiK2 iRWw== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:date:mime-version:references:subject:cc:to:from :dkim-signature:dkim-signature:message-id; bh=+hrw46hsMBswWQNzqDZfoOo5VDQtds9fIHiVlhGFvxE=; fh=MJzvnywV9/WrN/ASipmGkNx/7jKFHnq83nsgXe/obdc=; b=yqGD8tpmXpKEDltYjf+LeY59rEJ4vfi/ASuW8Z6bB0DQNGdjNkvj1UOa7AP3zk765N 38zANaAjEqYAyaImGXYdrtTXey9AAVaq8Tl28jAoDh04L3J0sp5bD531js4Hgrg3LuOl NUmiAkgEF8F6ca70jwXEtKJjM1M8TPrQQsxgxND93waJdz0Z1iNxe5l8V1JHMQM8uKNj G2Kfl7i/VhH5NjvkeawGDQRrmKO5A318FhLziT4h2vG6bZaQf0mdTSyJ9NqFnKKJxJnq fRce9HlM7vHmFdsKOf/P/K558ZvZVNfmS13NDYrWogNwtUV/Il7pTbOX4UDAaKrWLQxk dekQ== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@linutronix.de header.s=2020 header.b=1iTxgDBd; dkim=neutral (no key) header.i=@linutronix.de; 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 q9-20020aa7d449000000b0051dd4de9b90si271645edr.509.2023.07.17.16.17.29; Mon, 17 Jul 2023 16:17:52 -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=1iTxgDBd; dkim=neutral (no key) header.i=@linutronix.de; 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 S231362AbjGQXPR (ORCPT + 99 others); Mon, 17 Jul 2023 19:15:17 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:34966 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S231316AbjGQXPC (ORCPT ); Mon, 17 Jul 2023 19:15:02 -0400 Received: from galois.linutronix.de (Galois.linutronix.de [193.142.43.55]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 20004E51 for ; Mon, 17 Jul 2023 16:14:51 -0700 (PDT) Message-ID: <20230717223223.679207826@linutronix.de> DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linutronix.de; s=2020; t=1689635690; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: references:references; bh=+hrw46hsMBswWQNzqDZfoOo5VDQtds9fIHiVlhGFvxE=; b=1iTxgDBd2IbtrJHBH42NS0qXgndUHXqc+7hJZhMPlsQ1A5nnuWul3sMzl1eRLXfeL79pal 6M8fKqhPBbLvUGtpV6azGOGtAzJJrbxi3/x2wDCA7V1+RmHC84NRiWYKNXIHmwWZhW5ny3 YCN5lpG9uZAC0AveAZ1JK0yfseY4HNZFMCGOTUlTg8Ggn/anco5DaSbMbIqMMll3AVbWBe mzIBF21GQmLd55tm7d3RRgZZ4sXmkgKz44j9OpUBGcjdxBBuoKp7X/Sh6zmwAHZuCnIF/t sC3HmdEAFAdUrBq7X9t+1n9PNKlpW5p2orCq35A8ulMSINTDxYzaI6vGi1rfeg== DKIM-Signature: v=1; a=ed25519-sha256; c=relaxed/relaxed; d=linutronix.de; s=2020e; t=1689635690; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: references:references; bh=+hrw46hsMBswWQNzqDZfoOo5VDQtds9fIHiVlhGFvxE=; b=iAwgexARZuIjyMMP7UxCAZX4JGqXaF5PrTmuzRWnXmv0RdbAK+3jOqKoz3aUpSMx1/Ml/O n+7JxTHMmJ8CMNCw== From: Thomas Gleixner To: LKML Cc: x86@kernel.org, Linus Torvalds , Andrew Cooper , Tom Lendacky , Paolo Bonzini , Wei Liu , Arjan van de Ven , Juergen Gross Subject: [patch 10/58] x86/apic: Register boot CPU APIC early References: <20230717223049.327865981@linutronix.de> MIME-Version: 1.0 Date: Tue, 18 Jul 2023 01:14:49 +0200 (CEST) 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,T_SCC_BODY_TEXT_LINE 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: 1771711624651049333 X-GMAIL-MSGID: 1771711624651049333 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 --- arch/x86/kernel/apic/apic.c | 120 ++++++++++++++++++-------------------------- 1 file changed, 50 insertions(+), 70 deletions(-) --- 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 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 ap 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, i 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) {