Received: by 2002:a05:7412:d8a:b0:e2:908c:2ebd with SMTP id b10csp3421073rdg; Tue, 17 Oct 2023 14:24:49 -0700 (PDT) X-Google-Smtp-Source: AGHT+IHJAph6sq5dfYrtCv8eCBGcqOgRWI/UbxU8pGQSYV/KroNdU/t6utdZfjgrBJD0NStGJ0tF X-Received: by 2002:a17:903:244b:b0:1c9:dfb8:a5a0 with SMTP id l11-20020a170903244b00b001c9dfb8a5a0mr4619870pls.10.1697577889620; Tue, 17 Oct 2023 14:24:49 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1697577889; cv=none; d=google.com; s=arc-20160816; b=Hi5tcy6rJqbgfrQ1F2rrG20+Alcwp3UVCMLLjqfUoUC8M+/vAu+AWlBJ5qXZdfyqPZ /3A/kgt1kTfX3vQ3cT4jpEZqWXxzPV3A9xFxpsgw62ka5QW2qxmjE3ZKnCkmLTjWhz4K +D1KHIgxzoxBXEYgHYFvMEoGy2uN/4e5AoyMy/4/HIYJGRR40ju8n7xKdnJ6v1BjNFy0 54mlYnckwj5BZZI3YPJzN8OSopgrW1vKUgrA/sE6JfR6RkVx5eeawtChrZeMQnVrHo1q /RbT65c4alN1oGle7uemqYInIrP495ekkjvsY/8clXOju0g0qESAGG3Qj9gklkdVW0aH ReHg== 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=IngjRZMYBg+VzV6jYzAlKokUKzc8AuAEYq+N8B/D1cs=; fh=8iy+GLBXZdpcs/hIddJ7mbUapYjefwP9Gb111pAzFms=; b=UfNG10vimyMqnuQN7pi5kaT+vdFUZFIQ7CU9HF8PZmGp9jgR+tg21VCwVNfegOKlkg m8MHiQyiE543nUJ4ZIenQ+3i3n118P4fDZ1XxVhoU9uGiLE9//vcMelNLrxCxY7aXs71 KNHvBk5BCIKaZQiImX6VPVG5X2lYqox8UxOofPRtyVU4OfGjOD/1vY2ievWmUVyIvN9Z vhQUeRS7XE40qyqBvTsUAgbWBlW/NTMV5iWUzQqctTFjZIUZfGXnlBLQ7/dEMsfTI76F J7I5V6k1qHtsnZJyNFkhDABVEH2DPA8T5CCUYNjk/z1AAhA50xHrHqq1n7iFCRGTbp1N zaoQ== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@linutronix.de header.s=2020 header.b=GJgy2+dR; dkim=neutral (no key) header.i=@linutronix.de header.b=lz8GikNW; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.33 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=QUARANTINE dis=NONE) header.from=linutronix.de Return-Path: Received: from lipwig.vger.email (lipwig.vger.email. [23.128.96.33]) by mx.google.com with ESMTPS id y10-20020a17090322ca00b001c9d9050b37si2670230plg.260.2023.10.17.14.24.49 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 17 Oct 2023 14:24:49 -0700 (PDT) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.33 as permitted sender) client-ip=23.128.96.33; Authentication-Results: mx.google.com; dkim=pass header.i=@linutronix.de header.s=2020 header.b=GJgy2+dR; dkim=neutral (no key) header.i=@linutronix.de header.b=lz8GikNW; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.33 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 (depot.vger.email [IPv6:2620:137:e000::3:0]) by lipwig.vger.email (Postfix) with ESMTP id 93DBD80F5F3C; Tue, 17 Oct 2023 14:24:44 -0700 (PDT) X-Virus-Status: Clean X-Virus-Scanned: clamav-milter 0.103.10 at lipwig.vger.email Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1344368AbjJQVYV (ORCPT + 99 others); Tue, 17 Oct 2023 17:24:21 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:33434 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S235051AbjJQVYH (ORCPT ); Tue, 17 Oct 2023 17:24:07 -0400 Received: from galois.linutronix.de (Galois.linutronix.de [193.142.43.55]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 1189F19D for ; Tue, 17 Oct 2023 14:23:44 -0700 (PDT) Message-ID: <20231017211722.684478751@linutronix.de> DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linutronix.de; s=2020; t=1697577821; 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=IngjRZMYBg+VzV6jYzAlKokUKzc8AuAEYq+N8B/D1cs=; b=GJgy2+dRIwEnNDuSq07extpWPmQgYDylQ5koP9G88almTeNbawYL86g1gIvjPKA2ohzeqH Odet0jCHUCS35zRtdgpNEb1ifRQX2qFS/DihTzjd07lZxeTiEZwDt0wx0aPRfS8NnHEebT qW5s63VCN84TdRFneGVtOnY1AJx5ACcwstxiv/T9xb9BcnzzZwerAxcY66dBSV4iXb1r6K MK/37DxuiD5QV4L/dEwrZrT6nWbJvvm6hDyjooQ/ccLWN3EiQr/W1DmS8gEGqtYqLZqabv 8zyoR+tSCQu0ly/2G2NrPpeIakbvdW5SzBDkBnyLgQa/UpOcC1Z/Czf+k9lYrw== DKIM-Signature: v=1; a=ed25519-sha256; c=relaxed/relaxed; d=linutronix.de; s=2020e; t=1697577821; 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=IngjRZMYBg+VzV6jYzAlKokUKzc8AuAEYq+N8B/D1cs=; b=lz8GikNW2MDaI+OdI2bTncK6u/xvUN3QLoosaN39CILvqzyikcjml4AHGyonlOnWFpg0ki VSEeZnKI1dQsG/BA== From: Thomas Gleixner To: LKML Cc: x86@kernel.org, Borislav Petkov Subject: [patch V5 13/39] x86/microcode/intel: Save the microcode only after a successful late-load References: <20231017200758.877560658@linutronix.de> MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Date: Tue, 17 Oct 2023 23:23:41 +0200 (CEST) X-Spam-Status: No, score=-0.8 required=5.0 tests=DKIM_SIGNED,DKIM_VALID, DKIM_VALID_AU,HEADER_FROM_DIFFERENT_DOMAINS,MAILING_LIST_MULTI, SPF_HELO_NONE,SPF_PASS autolearn=unavailable autolearn_force=no version=3.4.6 X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on lipwig.vger.email Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org X-Greylist: Sender passed SPF test, not delayed by milter-greylist-4.6.4 (lipwig.vger.email [0.0.0.0]); Tue, 17 Oct 2023 14:24:44 -0700 (PDT) From: Thomas Gleixner There are situations where the late microcode is loaded into memory but is not applied: 1) The rendezvous fails 2) The microcode is rejected by the CPUs If any of this happens then the pointer which was updated at firmware load time is stale and subsequent CPU hotplug operations either fail to update or create inconsistent microcode state. Save the loaded microcode in a separate pointer before the late load is attempted and when successful, update the hotplug pointer accordingly via a new microcode_ops callback. Remove the pointless fallback in the loader to a microcode pointer which is never populated. Signed-off-by: Thomas Gleixner --- arch/x86/kernel/cpu/microcode/core.c | 4 ++++ arch/x86/kernel/cpu/microcode/intel.c | 30 +++++++++++++++--------------- arch/x86/kernel/cpu/microcode/internal.h | 1 + 3 files changed, 20 insertions(+), 15 deletions(-) --- --- a/arch/x86/kernel/cpu/microcode/core.c +++ b/arch/x86/kernel/cpu/microcode/core.c @@ -397,6 +397,10 @@ static int microcode_reload_late(void) store_cpu_caps(&prev_info); ret = stop_machine_cpuslocked(__reload_late, NULL, cpu_online_mask); + + if (microcode_ops->finalize_late_load) + microcode_ops->finalize_late_load(ret); + if (!ret) { pr_info("Reload succeeded, microcode revision: 0x%x -> 0x%x\n", old, boot_cpu_data.microcode); --- a/arch/x86/kernel/cpu/microcode/intel.c +++ b/arch/x86/kernel/cpu/microcode/intel.c @@ -34,6 +34,7 @@ static const char ucode_path[] = "kernel /* Current microcode patch used in early patching on the APs. */ static struct microcode_intel *ucode_patch_va __read_mostly; +static struct microcode_intel *ucode_patch_late __read_mostly; /* last level cache size per core */ static unsigned int llc_size_per_core __ro_after_init; @@ -454,12 +455,9 @@ static enum ucode_state apply_microcode_ if (WARN_ON(raw_smp_processor_id() != cpu)) return UCODE_ERROR; - mc = ucode_patch_va; - if (!mc) { - mc = uci->mc; - if (!mc) - return UCODE_NFOUND; - } + mc = ucode_patch_late; + if (!mc) + return UCODE_NFOUND; /* * Save us the MSR write below - which is a particular expensive @@ -578,15 +576,7 @@ static enum ucode_state parse_microcode_ if (!new_mc) return UCODE_NFOUND; - /* Save for CPU hotplug */ - save_microcode_patch((struct microcode_intel *)new_mc); - uci->mc = ucode_patch_va; - - vfree(new_mc); - - pr_debug("CPU%d found a matching microcode update with version 0x%x (current=0x%x)\n", - cpu, cur_rev, uci->cpu_sig.rev); - + ucode_patch_late = (struct microcode_intel *)new_mc; return UCODE_NEW; } @@ -643,10 +633,20 @@ static enum ucode_state request_microcod return ret; } +static void finalize_late_load(int result) +{ + if (!result) + save_microcode_patch(ucode_patch_late); + + vfree(ucode_patch_late); + ucode_patch_late = NULL; +} + static struct microcode_ops microcode_intel_ops = { .request_microcode_fw = request_microcode_fw, .collect_cpu_info = collect_cpu_info, .apply_microcode = apply_microcode_intel, + .finalize_late_load = finalize_late_load, }; static __init void calc_llc_size_per_core(struct cpuinfo_x86 *c) --- a/arch/x86/kernel/cpu/microcode/internal.h +++ b/arch/x86/kernel/cpu/microcode/internal.h @@ -31,6 +31,7 @@ struct microcode_ops { */ enum ucode_state (*apply_microcode)(int cpu); int (*collect_cpu_info)(int cpu, struct cpu_signature *csig); + void (*finalize_late_load)(int result); }; extern struct ucode_cpu_info ucode_cpu_info[];