| From 78f4e932f7760d965fb1569025d1576ab77557c5 Mon Sep 17 00:00:00 2001 |
| From: Borislav Petkov <bp@suse.de> |
| Date: Thu, 13 Jun 2019 15:49:02 +0200 |
| Subject: x86/microcode, cpuhotplug: Add a microcode loader CPU hotplug callback |
| |
| From: Borislav Petkov <bp@suse.de> |
| |
| commit 78f4e932f7760d965fb1569025d1576ab77557c5 upstream. |
| |
| Adric Blake reported the following warning during suspend-resume: |
| |
| Enabling non-boot CPUs ... |
| x86: Booting SMP configuration: |
| smpboot: Booting Node 0 Processor 1 APIC 0x2 |
| unchecked MSR access error: WRMSR to 0x10f (tried to write 0x0000000000000000) \ |
| at rIP: 0xffffffff8d267924 (native_write_msr+0x4/0x20) |
| Call Trace: |
| intel_set_tfa |
| intel_pmu_cpu_starting |
| ? x86_pmu_dead_cpu |
| x86_pmu_starting_cpu |
| cpuhp_invoke_callback |
| ? _raw_spin_lock_irqsave |
| notify_cpu_starting |
| start_secondary |
| secondary_startup_64 |
| microcode: sig=0x806ea, pf=0x80, revision=0x96 |
| microcode: updated to revision 0xb4, date = 2019-04-01 |
| CPU1 is up |
| |
| The MSR in question is MSR_TFA_RTM_FORCE_ABORT and that MSR is emulated |
| by microcode. The log above shows that the microcode loader callback |
| happens after the PMU restoration, leading to the conjecture that |
| because the microcode hasn't been updated yet, that MSR is not present |
| yet, leading to the #GP. |
| |
| Add a microcode loader-specific hotplug vector which comes before |
| the PERF vectors and thus executes earlier and makes sure the MSR is |
| present. |
| |
| Fixes: 400816f60c54 ("perf/x86/intel: Implement support for TSX Force Abort") |
| Reported-by: Adric Blake <promarbler14@gmail.com> |
| Signed-off-by: Borislav Petkov <bp@suse.de> |
| Reviewed-by: Thomas Gleixner <tglx@linutronix.de> |
| Cc: Peter Zijlstra <peterz@infradead.org> |
| Cc: <stable@vger.kernel.org> |
| Cc: x86@kernel.org |
| Link: https://bugzilla.kernel.org/show_bug.cgi?id=203637 |
| Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> |
| |
| --- |
| arch/x86/kernel/cpu/microcode/core.c | 2 +- |
| include/linux/cpuhotplug.h | 1 + |
| 2 files changed, 2 insertions(+), 1 deletion(-) |
| |
| --- a/arch/x86/kernel/cpu/microcode/core.c |
| +++ b/arch/x86/kernel/cpu/microcode/core.c |
| @@ -876,7 +876,7 @@ int __init microcode_init(void) |
| goto out_ucode_group; |
| |
| register_syscore_ops(&mc_syscore_ops); |
| - cpuhp_setup_state_nocalls(CPUHP_AP_ONLINE_DYN, "x86/microcode:online", |
| + cpuhp_setup_state_nocalls(CPUHP_AP_MICROCODE_LOADER, "x86/microcode:online", |
| mc_cpu_online, mc_cpu_down_prep); |
| |
| pr_info("Microcode Update Driver: v%s.", DRIVER_VERSION); |
| --- a/include/linux/cpuhotplug.h |
| +++ b/include/linux/cpuhotplug.h |
| @@ -101,6 +101,7 @@ enum cpuhp_state { |
| CPUHP_AP_IRQ_BCM2836_STARTING, |
| CPUHP_AP_IRQ_MIPS_GIC_STARTING, |
| CPUHP_AP_ARM_MVEBU_COHERENCY, |
| + CPUHP_AP_MICROCODE_LOADER, |
| CPUHP_AP_PERF_X86_AMD_UNCORE_STARTING, |
| CPUHP_AP_PERF_X86_STARTING, |
| CPUHP_AP_PERF_X86_AMD_IBS_STARTING, |