From patchwork Mon Feb 19 10:13:28 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Arnd Bergmann X-Patchwork-Id: 128793 Delivered-To: patch@linaro.org Received: by 10.46.124.24 with SMTP id x24csp3332297ljc; Mon, 19 Feb 2018 02:17:07 -0800 (PST) X-Google-Smtp-Source: AH8x2252oXUnI0q9Q8oHVkUc2lU4ynaB51NUJWBCK/HSeuesez+UpV0YbWiE1Fk8Phuez8PRUJlD X-Received: by 10.99.181.94 with SMTP id u30mr12015822pgo.205.1519035426920; Mon, 19 Feb 2018 02:17:06 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1519035426; cv=none; d=google.com; s=arc-20160816; b=riAfO+qYxS4WWG+0L+g0BHs8Cd3lkihWe1tHaW7YcGi6SVURq3FIDZCxvuIV+eLEHm li08UqHVw5pLFaUsPV8c4o+H2QpRWl3Y3kHTGl20flBXD+NkaiSCHElvspxAGj2h9MQr lpEApKItvtUXb/cASYHUIqzVaqeo6/Tde2xSR++EapRadjegUr1gPaIrpdsrnxWbkOwX MCRxYfrgowlEy84oNqIYuni2iL11MmxjtjnAA6PhlJxy0Jvq5XEAfXjON2i8xZBPiB7k y4D14LkzPJntigBJUIrq/rBaleq1Lswul5f02Zywy6N2hNDVefYPM611tosHH2xGYlwE Jjaw== 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=acPV9+Vvii0MQv+6zcfARsxdyUCgSMkykczyp8FBWNw=; b=EXhmeqWCdFOlSho3oic1B6v0YSNB/J3m7sa9JAaz8KhK6hpRMtVdoAzNHd2XLEF2AT Ttskb0ukgZosvSC4loG9VT9L4EFifUU/VNRdbUsOoI2pAJFBbEbvBT3ZMoB+QArgcI2P QBO7DwFziFI/XDvwtXOcidG+8xPP+Cb9ip5hdA3yQwUhX2+sCPYZw6+A2qM/Y3qTOcCR NFZaG6Bc9Dlw3OBBKeqQUkCPW/bczxbZrZ942KRSkfpG8vDRo7zCOa+tWaBb8qDR6IJB IMILaPZWbwidoZ+q33TDv98nMT0dyzGSkUU3kyfUyxtPmq9eJN6nSmjKO+Lk6embnPrb kw2g== 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 x4si950150pgq.11.2018.02.19.02.17.06; Mon, 19 Feb 2018 02:17:06 -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 S1752648AbeBSKRD (ORCPT + 28 others); Mon, 19 Feb 2018 05:17:03 -0500 Received: from mout.kundenserver.de ([212.227.126.131]:42783 "EHLO mout.kundenserver.de" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1752340AbeBSKRB (ORCPT ); Mon, 19 Feb 2018 05:17:01 -0500 Received: from wuerfel.lan ([95.208.111.237]) by mrelayeu.kundenserver.de (mreue006 [212.227.15.129]) with ESMTPA (Nemesis) id 0Mh2kG-1f9njR2rlg-00M74g; Mon, 19 Feb 2018 11:15:25 +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.9-stable 9/9] x86/microcode/AMD: Change load_microcode_amd()'s param to bool to fix preemptibility bug Date: Mon, 19 Feb 2018 11:13:28 +0100 Message-Id: <20180219101343.2922561-10-arnd@arndb.de> X-Mailer: git-send-email 2.9.0 In-Reply-To: <20180219101343.2922561-1-arnd@arndb.de> References: <20180219101343.2922561-1-arnd@arndb.de> X-Provags-ID: V03:K0:miF91a+nOXIMpHw0LqA4YS6FMvmvDqfDx/QEyBcZHPJ2KQxRIKm OEqMmjZuawoQOR1NyJQpXNYAZ2aj1qaYmqZwrEbC07h5sALNZK1i80TKZRwcXed19SpFq+I DBKJVY0JXqVllr1kCUEBNEHBmjV6TiKMbZ1vvhAWCWrjzz/ceOLoCky8QfPnKVL69bqoQCp oHHNu6Ix9kWJgBoybyzxw== X-UI-Out-Filterresults: notjunk:1; V01:K0:4rg4hwcvZ60=:YJTNypg7s12hmv9xz/iRSG 6j6J1yhwta+h8rB9oFkXWtHJ1HbHTeB2eRfohjNLxY+AwuqPtgYp/RG1dMDbGw+vVZ1VriX1W 339HuijABq5NqomorXzkYpl6Umxqf9j9MoGuZWzk7FjdXGhDSlvl0+Sumc/ULAqfQjTMSaadA /eV90d0bTPAr3YTzc8Pj7cmmsgJoK5urUbRXEwJbR78UnLHDjj+7sIjjCAgNNtF3V/NbiiPI2 +lVrxQv3KqvsiHooJep4WTQrvk1No2V6WkQmbi0OWQHo9n3RIxFe+OSA2/rsCbVdkpRjtZI0F R+O0FdYK7bTv+wG6n53wTODCxWEoo8DWctdDB4/WY02sQUI/IOtyGdjY7il1V3RRb1ggXGL9h H2FTQO/8j2T4JImI4GL4fuH6Y/LIJ7zAHpPWENGKwCMoZDZEJwBqSKXpuDwWsORD3uFb57SiU /e/k9/PI1ZmnrwBunN5M1Ow7A3eUIM3SCUCA6/YUGyvIoVfjTA+FpyexMyyaVc6aRSSsKsY5S 73rYZiwechNFS9AkjmhYtCM2Ei89DRASN4Joo70jbkDLkRQvxoc6S9CE4F239D8rcAnKPBycs LyEQyPstiM8gVW3fWB8MYXvp080zQKULW0KiI4UBsMgfwTJD1RlATH+oAl72w0xN2T0ugrJs6 CXcLcniUQ9HeZ75ycm3adT3/M3OpHOIiG49uA4vUSh7clthc6VfU7+Cekt3kZMGuecKNlUg+m OXUsl3Nu3oqDVWgHo7j06k0Jmz5PHUKmCAlxPg== 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 15eb75484cc0..98ccbd1dbb01 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 diff --git a/arch/x86/kernel/cpu/microcode/amd.c b/arch/x86/kernel/cpu/microcode/amd.c index b74bb29db6b9..732bb03fcf91 100644 --- a/arch/x86/kernel/cpu/microcode/amd.c +++ b/arch/x86/kernel/cpu/microcode/amd.c @@ -135,6 +135,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 @@ -451,7 +454,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; @@ -864,7 +867,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; @@ -878,8 +882,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), @@ -911,11 +915,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) @@ -932,7 +937,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);