• Ingo Molnar's avatar
    x86/fpu: Micro-optimize the copy_xregs_to_kernel*() and copy_kernel_to_xregs*() functions · 8c05f05e
    Ingo Molnar authored
    The copy_xregs_to_kernel*() and copy_kernel_to_xregs*() functions are used
    to copy FPU registers to kernel memory and vice versa.
    
    They are never expected to fail, yet they have a return code, mostly because
    that way they can share the assembly macros with the copy*user*() functions.
    
    This error code is then silently ignored by the context switching
    and other code - which made the bug in:
    
      b8c1b8ea ("x86/fpu: Fix FPU state save area alignment bug")
    
    harder to fix than necessary.
    
    So remove the return values and check for no faults when FPU debugging
    is enabled in the .config.
    
    This improves the eagerfpu context switching fast path by a couple of
    instructions, when FPU debugging is disabled:
    
       ffffffff810407fa:      89 c2                   mov    %eax,%edx
       ffffffff810407fc:      48 0f ae 2f             xrstor64 (%rdi)
       ffffffff81040800:      31 c0                   xor    %eax,%eax
      -ffffffff81040802:      eb 0a                   jmp    ffffffff8104080e <__switch_to+0x321>
      +ffffffff81040802:      eb 16                   jmp    ffffffff8104081a <__switch_to+0x32d>
       ffffffff81040804:      31 c0                   xor    %eax,%eax
       ffffffff81040806:      48 0f ae 8b c0 05 00    fxrstor64 0x5c0(%rbx)
       ffffffff8104080d:      00
    
    Cc: Andy Lutomirski <luto@amacapital.net>
    Cc: Borislav Petkov <bp@alien8.de>
    Cc: Dave Hansen <dave.hansen@linux.intel.com>
    Cc: Fenghua Yu <fenghua.yu@intel.com>
    Cc: H. Peter Anvin <hpa@zytor.com>
    Cc: Linus Torvalds <torvalds@linux-foundation.org>
    Cc: Oleg Nesterov <oleg@redhat.com>
    Cc: Thomas Gleixner <tglx@linutronix.de>
    Cc: linux-kernel@vger.kernel.org
    Signed-off-by: default avatarIngo Molnar <mingo@kernel.org>
    8c05f05e
internal.h 17.5 KB