• Peter Zijlstra's avatar
    x86: Remove dynamic NOP selection · a89dfde3
    Peter Zijlstra authored
    This ensures that a NOP is a NOP and not a random other instruction that
    is also a NOP. It allows simplification of dynamic code patching that
    wants to verify existing code before writing new instructions (ftrace,
    jump_label, static_call, etc..).
    
    Differentiating on NOPs is not a feature.
    
    This pessimises 32bit (DONTCARE) and 32bit on 64bit CPUs (CARELESS).
    32bit is not a performance target.
    
    Everything x86_64 since AMD K10 (2007) and Intel IvyBridge (2012) is
    fine with using NOPL (as opposed to prefix NOP). And per FEATURE_NOPL
    being required for x86_64, all x86_64 CPUs can use NOPL. So stop
    caring about NOPs, simplify things and get on with life.
    
    [ The problem seems to be that some uarchs can only decode NOPL on a
    single front-end port while others have severe decode penalties for
    excessive prefixes. All modern uarchs can handle both, except Atom,
    which has prefix penalties. ]
    
    [ Also, much doubt you can actually measure any of this on normal
    workloads. ]
    
    After this, FEATURE_NOPL is unused except for required-features for
    x86_64. FEATURE_K8 is only used for PTI.
    
     [ bp: Kernel build measurements showed ~0.3s slowdown on Sandybridge
       which is hardly a slowdown. Get rid of X86_FEATURE_K7, while at it. ]
    Signed-off-by: default avatarPeter Zijlstra (Intel) <peterz@infradead.org>
    Signed-off-by: default avatarBorislav Petkov <bp@suse.de>
    Acked-by: Alexei Starovoitov <alexei.starovoitov@gmail.com> # bpf
    Acked-by: default avatarLinus Torvalds <torvalds@linuxfoundation.org>
    Link: https://lkml.kernel.org/r/20210312115749.065275711@infradead.org
    a89dfde3
nops.h 1.96 KB