• Dave Hansen's avatar
    x86/mm/pkeys: Fix compact mode by removing protection keys' XSAVE buffer manipulation · b79daf85
    Dave Hansen authored
    The Memory Protection Keys "rights register" (PKRU) is
    XSAVE-managed, and is saved/restored along with the FPU state.
    
    When kernel code accesses FPU regsisters, it does a delicate
    dance with preempt.  Otherwise, the context switching code can
    get confused as to whether the most up-to-date state is in the
    registers themselves or in the XSAVE buffer.
    
    But, PKRU is not a normal FPU register.  Using it does not
    generate the normal device-not-available (#NM) exceptions which
    means we can not manage it lazily, and the kernel completley
    disallows using lazy mode when it is enabled.
    
    The dance with preempt *only* occurs when managing the FPU
    lazily.  Since we never manage PKRU lazily, we do not have to do
    the dance with preempt; we can access it directly.  Doing it
    this way saves a ton of complicated code (and is faster too).
    
    Further, the XSAVES reenabling failed to patch a bit of code
    in fpu__xfeature_set_state() the checked for compacted buffers.
    That check caused fpu__xfeature_set_state() to silently refuse to
    work when the kernel is using compacted XSAVE buffers.  This
    broke execute-only and future pkey_mprotect() support when using
    compact XSAVE buffers.
    
    But, removing fpu__xfeature_set_state() gets rid of this issue,
    in addition to the nice cleanup and speedup.
    
    This fixes the same thing as a fix that Sai posted:
    
      https://lkml.org/lkml/2016/7/25/637
    
    The fix that he posted is a much more obviously correct, but I
    think we should just do this instead.
    Reported-by: default avatarSai Praneeth Prakhya <sai.praneeth.prakhya@intel.com>
    Signed-off-by: default avatarDave Hansen <dave.hansen@linux.intel.com>
    Cc: Andy Lutomirski <luto@kernel.org>
    Cc: Borislav Petkov <bp@alien8.de>
    Cc: Dave Hansen <dave.hansen@intel.com>
    Cc: Dave Hansen <dave@sr71.net>
    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: Peter Zijlstra <peterz@infradead.org>
    Cc: Quentin Casasnovas <quentin.casasnovas@oracle.com>
    Cc: Ravi Shankar <ravi.v.shankar@intel.com>
    Cc: Thomas Gleixner <tglx@linutronix.de>
    Cc: Yu-Cheng Yu <yu-cheng.yu@intel.com>
    Link: http://lkml.kernel.org/r/20160727232040.7D060DAD@viggo.jf.intel.comSigned-off-by: default avatarIngo Molnar <mingo@kernel.org>
    b79daf85
xstate.c 28.5 KB