From patchwork Tue Feb 20 11:55:05 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Arnd Bergmann X-Patchwork-Id: 128889 Delivered-To: patch@linaro.org Received: by 10.46.124.24 with SMTP id x24csp4557036ljc; Tue, 20 Feb 2018 04:01:42 -0800 (PST) X-Google-Smtp-Source: AH8x227xTu8BJEEhkwbonBaV1ElnDba6+Rt7hNqXG4U2L2bG1w3WLUku0g1LFk35nExFiovdAx87 X-Received: by 10.98.33.4 with SMTP id h4mr17654589pfh.144.1519128102306; Tue, 20 Feb 2018 04:01:42 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1519128102; cv=none; d=google.com; s=arc-20160816; b=StkEFaMrmf8sJZwZzGP4AuIkqS51HwXhwziiTlhVCKpGIXOLAIsJx/StDp7C97SYsc kqVVhr0R7o1c5oUbWJSZYGYFGiusUZ5JXMBxfFeW91D5jOm1wOWYHT9k+M3iXllTmU+i Xlq+p68EffW58BS//nOi62YOTwziE8CqPxsIbo10rZsPTooQ61kydFwGAtXsf80/r6ll 0zVao9rqLioZx3oeIXIJxjRkg2V8YBxnvLTXZcp2aL2hJxhc8CGXJsCZXtpnUSZTrZ6g Wq6OWsomoH1VYJA3ZEckJubuImTouVenROi80/wkqcRS/r3oAuPirDaWCzK+iVrw/bD3 mIUA== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:references:in-reply-to:message-id:date :subject:cc:to:from:arc-authentication-results; bh=STfyYkQNttJko4nQxXNkFvQN9OwWEZTdfoBqwAFtIK0=; b=0cYWxix3s/fOMbqTTyG++GJanmf/iAlXkLlNuaLU4SK0hRirS9DB2VQptzOarF999P SbGuM6m1o0tkhvWbM77UIRzLe7/i3teHw/iP9qkh7udLONjVL9Z/jzrNXc0i4pmtr0Vb X69P0OmRIG/COyFb8lA92tFweXlCp6LHR3YXXfG+R6BV4WbnqvngEew/TxJSuubUpD60 lG9D0v1hWNCh9qmXZrrcU7dxcB5QDHcP38gsWDj6aJrYxexEIZ2fLLqOYYA++ZKGIGtd MF9RV6LDvETIWjJTqxYcYyDZT1YgftS+DhWPAsP5IlhW9sZdpM6IRk88nC+8zlde4tAt iqXw== 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 x2-v6si11419995plv.672.2018.02.20.04.01.35; Tue, 20 Feb 2018 04:01:42 -0800 (PST) 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 S1751845AbeBTMBc (ORCPT + 28 others); Tue, 20 Feb 2018 07:01:32 -0500 Received: from mout.kundenserver.de ([217.72.192.75]:56899 "EHLO mout.kundenserver.de" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1751559AbeBTMBa (ORCPT ); Tue, 20 Feb 2018 07:01:30 -0500 Received: from wuerfel.lan ([95.208.111.237]) by mrelayeu.kundenserver.de (mreue105 [212.227.15.145]) with ESMTPA (Nemesis) id 0M9XrD-1euS6L40Df-00Cxv0; Tue, 20 Feb 2018 12:59:51 +0100 From: Arnd Bergmann To: stable@vger.kernel.org Cc: Greg KH , linux-kernel@vger.kernel.org, Borislav Petkov , Linus Torvalds , Peter Zijlstra , Thomas Gleixner , Ingo Molnar , Arnd Bergmann , Ingo Molnar , "H. Peter Anvin" , x86@kernel.org, Borislav Petkov , Tom Lendacky Subject: [4.4-stable 18/22] x86/microcode/AMD: Change load_microcode_amd()'s param to bool to fix preemptibility bug Date: Tue, 20 Feb 2018 12:55:05 +0100 Message-Id: <20180220115527.1806578-19-arnd@arndb.de> X-Mailer: git-send-email 2.9.0 In-Reply-To: <20180220115527.1806578-1-arnd@arndb.de> References: <20180220115527.1806578-1-arnd@arndb.de> X-Provags-ID: V03:K0:uqE8s66uMNTDhEJLexQJsyxkl+IH4+MKM+9K2WK5FlmqSq2hlB2 aWuM+QMpAZs9EZeTjd9BQW0H/tOR3kJJ9nYsAdas+xWJObHX1dPUTcGG+45PXBqZiqhsqGq 9eeBNX9y4vFMPg4rBzm9QRtoMZxNPBqsI/UAcZQrjzTVCaiaqVxoiKRGNZJpbZ5LDrvvQGE HLLeYdXCmTCs285sUIpYQ== X-UI-Out-Filterresults: notjunk:1; V01:K0:jq9k2wDqHgE=:ddbdEMsb4jpd0hcyKLuMOj H7IHjddmguNQKGuIG98Zv4/jmdMft3VirdpRgfGJ9GA7iE498yhNoTLgeuQVlb4dOGV1p7CEA adgSF7V5cf1gZIshxnVOuE0bXXewYOdSlAjtXBILVHz64E0y7W4k7d9GtRdm6L9f/qEK4QF2g 1InWNB5Xt8eSyciuUw7SWN8PhbXspfzyqrp9l0m8/7fvYOXRjeLduSsFFN7BSeOhyZXpWSGWb SDsl9hkQetHxMAzbEk+LuvNwD4sQTo8OaY2JgfcO0vaEqHTGeJcXZ02Lm9a5/PAa6MIKks/li oV/SaXKquVrbZg+SfmqL/p3iyrckopVvVHJW6NF4xrcuRdaLO3D+PdA5toIdzZtolga2pW1/S 8jotCcrKfGiSQ5BowHJ9M4hYN5CFZnF8iwK1W3f80RqICpJ6UDjYCjSjx1NkVBdP9gO3nvF5E nNKr2N23qvOQ8d+xL5Hofiyfwrq9cZzsVxCL0tx9E/OIXuC1NbzFdzZ8pJzdRoN8VFgGUw3gA +/Ju0ZnnZ0/a6dK+8Bag8L0UrD1iwv6fUhDdBTAk9CVKt6V56+fh9ws8HxPK5zxWq193qAV8a IWz1wRf32erbqoJMRWuC94SXAD3tsbcq0cdDUbjl7lZuA5Xpep7P6O5JcEOYO36lx+E3tYBTu j6Tv3VLZFBKFiZq3obgDOF/l8Q7Rq16qFA5ws6LyQdRRrcoUtJsBgsY2v66KpXnLFE5qUEpFN u3eZWpX+uE7c/WGbxJE+GS9/UsMKJ5l2DlbFew== Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org From: Borislav Petkov commit dac6ca243c4c49a9ca7507d3d66140ebfac8b04b upstream. With CONFIG_DEBUG_PREEMPT enabled, I get: BUG: using smp_processor_id() in preemptible [00000000] code: swapper/0/1 caller is debug_smp_processor_id CPU: 0 PID: 1 Comm: swapper/0 Not tainted 4.12.0-rc2+ #2 Call Trace: dump_stack check_preemption_disabled debug_smp_processor_id save_microcode_in_initrd_amd ? microcode_init save_microcode_in_initrd ... because, well, it says it above, we're using smp_processor_id() in preemptible code. But passing the CPU number is not really needed. It is only used to determine whether we're on the BSP, and, if so, to save the microcode patch for early loading. [ We don't absolutely need to do it on the BSP but we do that customarily there. ] Instead, convert that function parameter to a boolean which denotes whether the patch should be saved or not, thereby avoiding the use of smp_processor_id() in preemptible code. Signed-off-by: Borislav Petkov Cc: Linus Torvalds Cc: Peter Zijlstra Cc: Thomas Gleixner Link: http://lkml.kernel.org/r/20170528200414.31305-1-bp@alien8.de Signed-off-by: Ingo Molnar [arnd: rebased to 4.9, after running into warning: arch/x86/kernel/cpu/microcode/amd.c:881:30: self-comparison always evaluates to true] Signed-off-by: Arnd Bergmann --- arch/x86/include/asm/microcode_amd.h | 1 - arch/x86/kernel/cpu/microcode/amd.c | 17 +++++++++++------ 2 files changed, 11 insertions(+), 7 deletions(-) -- 2.9.0 diff --git a/arch/x86/include/asm/microcode_amd.h b/arch/x86/include/asm/microcode_amd.h index adfc847a395e..fb163f02ebb1 100644 --- a/arch/x86/include/asm/microcode_amd.h +++ b/arch/x86/include/asm/microcode_amd.h @@ -59,7 +59,6 @@ static inline u16 find_equiv_id(struct equiv_cpu_entry *equiv_cpu_table, extern int __apply_microcode_amd(struct microcode_amd *mc_amd); extern int apply_microcode_amd(int cpu); -extern enum ucode_state load_microcode_amd(int cpu, u8 family, const u8 *data, size_t size); #define PATCH_MAX_SIZE PAGE_SIZE extern u8 amd_ucode_patch[PATCH_MAX_SIZE]; diff --git a/arch/x86/kernel/cpu/microcode/amd.c b/arch/x86/kernel/cpu/microcode/amd.c index 2a0f44d225fe..6da6f9cd6d2d 100644 --- a/arch/x86/kernel/cpu/microcode/amd.c +++ b/arch/x86/kernel/cpu/microcode/amd.c @@ -131,6 +131,9 @@ static size_t compute_container_size(u8 *data, u32 total_size) return size; } +static enum ucode_state +load_microcode_amd(bool save, u8 family, const u8 *data, size_t size); + /* * Early load occurs before we can vmalloc(). So we look for the microcode * patch container file in initrd, traverse equivalent cpu table, look for a @@ -438,7 +441,7 @@ int __init save_microcode_in_initrd_amd(void) eax = cpuid_eax(0x00000001); eax = ((eax >> 8) & 0xf) + ((eax >> 20) & 0xff); - ret = load_microcode_amd(smp_processor_id(), eax, container, container_size); + ret = load_microcode_amd(true, eax, container, container_size); if (ret != UCODE_OK) retval = -EINVAL; @@ -854,7 +857,8 @@ static enum ucode_state __load_microcode_amd(u8 family, const u8 *data, return UCODE_OK; } -enum ucode_state load_microcode_amd(int cpu, u8 family, const u8 *data, size_t size) +static enum ucode_state +load_microcode_amd(bool save, u8 family, const u8 *data, size_t size) { enum ucode_state ret; @@ -868,8 +872,8 @@ enum ucode_state load_microcode_amd(int cpu, u8 family, const u8 *data, size_t s #ifdef CONFIG_X86_32 /* save BSP's matching patch for early load */ - if (cpu_data(cpu).cpu_index == boot_cpu_data.cpu_index) { - struct ucode_patch *p = find_patch(cpu); + if (save) { + struct ucode_patch *p = find_patch(0); if (p) { memset(amd_ucode_patch, 0, PATCH_MAX_SIZE); memcpy(amd_ucode_patch, p->data, min_t(u32, ksize(p->data), @@ -901,11 +905,12 @@ static enum ucode_state request_microcode_amd(int cpu, struct device *device, { char fw_name[36] = "amd-ucode/microcode_amd.bin"; struct cpuinfo_x86 *c = &cpu_data(cpu); + bool bsp = c->cpu_index == boot_cpu_data.cpu_index; enum ucode_state ret = UCODE_NFOUND; const struct firmware *fw; /* reload ucode container only on the boot cpu */ - if (!refresh_fw || c->cpu_index != boot_cpu_data.cpu_index) + if (!refresh_fw || !bsp) return UCODE_OK; if (c->x86 >= 0x15) @@ -922,7 +927,7 @@ static enum ucode_state request_microcode_amd(int cpu, struct device *device, goto fw_release; } - ret = load_microcode_amd(cpu, c->x86, fw->data, fw->size); + ret = load_microcode_amd(bsp, c->x86, fw->data, fw->size); fw_release: release_firmware(fw);