• Oleg Nesterov's avatar
    x86/fpu: Avoid math_state_restore() without used_math() in __restore_xstate_sig() · 6c47e87b
    Oleg Nesterov authored
    commit a7c80ebc upstream.
    
    math_state_restore() assumes it is called with irqs disabled,
    but this is not true if the caller is __restore_xstate_sig().
    
    This means that if ia32_fxstate == T and __copy_from_user()
    fails, __restore_xstate_sig() returns with irqs disabled too.
    
    This triggers:
    
      BUG: sleeping function called from invalid context at kernel/locking/rwsem.c:41
       dump_stack
       ___might_sleep
       ? _raw_spin_unlock_irqrestore
       __might_sleep
       down_read
       ? _raw_spin_unlock_irqrestore
       print_vma_addr
       signal_fault
       sys32_rt_sigreturn
    
    Change __restore_xstate_sig() to call set_used_math()
    unconditionally. This avoids enabling and disabling interrupts
    in math_state_restore(). If copy_from_user() fails, we can
    simply do fpu_finit() by hand.
    
    [ Note: this is only the first step. math_state_restore() should
            not check used_math(), it should set this flag. While
    	init_fpu() should simply die. ]
    Signed-off-by: default avatarOleg Nesterov <oleg@redhat.com>
    Signed-off-by: default avatarBorislav Petkov <bp@suse.de>
    Cc: Andy Lutomirski <luto@amacapital.net>
    Cc: Borislav Petkov <bp@alien8.de>
    Cc: Dave Hansen <dave.hansen@intel.com>
    Cc: Fenghua Yu <fenghua.yu@intel.com>
    Cc: H. Peter Anvin <hpa@zytor.com>
    Cc: Linus Torvalds <torvalds@linux-foundation.org>
    Cc: Pekka Riikonen <priikone@iki.fi>
    Cc: Quentin Casasnovas <quentin.casasnovas@oracle.com>
    Cc: Rik van Riel <riel@redhat.com>
    Cc: Suresh Siddha <sbsiddha@gmail.com>
    Cc: Thomas Gleixner <tglx@linutronix.de>
    Link: http://lkml.kernel.org/r/20150307153844.GB25954@redhat.comSigned-off-by: default avatarIngo Molnar <mingo@kernel.org>
    Signed-off-by: default avatarLuis Henriques <luis.henriques@canonical.com>
    6c47e87b
xsave.c 16.2 KB