• Waiman Long's avatar
    x86/idle: Disable IBRS when CPU is offline to improve single-threaded performance · 2743fe89
    Waiman Long authored
    Commit bf5835bc ("intel_idle: Disable IBRS during long idle")
    disables IBRS when the CPU enters long idle. However, when a CPU
    becomes offline, the IBRS bit is still set when X86_FEATURE_KERNEL_IBRS
    is enabled. That will impact the performance of a sibling CPU. Mitigate
    this performance impact by clearing all the mitigation bits in SPEC_CTRL
    MSR when offline. When the CPU is online again, it will be re-initialized
    and so restoring the SPEC_CTRL value isn't needed.
    
    Add a comment to say that native_play_dead() is a __noreturn function,
    but it can't be marked as such to avoid confusion about the missing
    MSR restoration code.
    
    When DPDK is running on an isolated CPU thread processing network packets
    in user space while its sibling thread is idle. The performance of the
    busy DPDK thread with IBRS on and off in the sibling idle thread are:
    
                                    IBRS on         IBRS off
                                    -------         --------
      packets/second:                  7.8M           10.4M
      avg tsc cycles/packet:         282.26          209.86
    
    This is a 25% performance degradation. The test system is a Intel Xeon
    4114 CPU @ 2.20GHz.
    
    [ mingo: Extended the changelog with performance data from the 0/4 mail. ]
    Signed-off-by: default avatarWaiman Long <longman@redhat.com>
    Signed-off-by: default avatarIngo Molnar <mingo@kernel.org>
    Acked-by: default avatarRafael J. Wysocki <rafael.j.wysocki@intel.com>
    Cc: Linus Torvalds <torvalds@linux-foundation.org>
    Link: https://lore.kernel.org/r/20230727184600.26768-3-longman@redhat.com
    2743fe89
smpboot.c 41.9 KB