lkml.org 
[lkml]   [2019]   [Jun]   [17]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 4.14 51/53] x86/microcode, cpuhotplug: Add a microcode loader CPU hotplug callback
    Date
    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
    @@ -873,7 +873,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
    @@ -100,6 +100,7 @@ enum cpuhp_state {
    CPUHP_AP_IRQ_ARMADA_XP_STARTING,
    CPUHP_AP_IRQ_BCM2836_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,

    \
     
     \ /
      Last update: 2019-06-17 23:31    [W:5.320 / U:0.476 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site