• Suresh Siddha's avatar
    x86, xsave: remove thread_has_fpu() bug check in __sanitize_i387_state() · d75f1b39
    Suresh Siddha authored
    Code paths like fork(), exit() and signal handling flush the fpu
    state explicitly to the structures in memory.
    
    BUG_ON() in __sanitize_i387_state() is checking that the fpu state
    is not live any more. But for preempt kernels, task can be scheduled
    out and in at any place and the preload_fpu logic during context switch
    can make the fpu registers live again.
    
    For example, consider a 64-bit Task which uses fpu frequently and as such
    you will find its fpu_counter mostly non-zero. During its time slice, kernel
    used fpu by doing kernel_fpu_begin/kernel_fpu_end(). After this, in the same
    scheduling slice, task-A got a signal to handle. Then during the signal
    setup path we got preempted when we are just before the sanitize_i387_state()
    in arch/x86/kernel/xsave.c:save_i387_xstate(). And when we come back we
    will have the fpu registers live that can hit the bug_on.
    
    Similarly during core dump, other threads can context-switch in and out
    (because of spurious wakeups while waiting for the coredump to finish in
     kernel/exit.c:exit_mm()) and the main thread dumping core can run into this
    bug when it finds some other thread with its fpu registers live on some other cpu.
    
    So remove the paranoid check for now, even though it caught a bug in the
    multi-threaded core dump case (fixed in the previous patch).
    Signed-off-by: default avatarSuresh Siddha <suresh.b.siddha@intel.com>
    Link: http://lkml.kernel.org/r/1336692811-30576-3-git-send-email-suresh.b.siddha@intel.com
    Cc: Oleg Nesterov <oleg@redhat.com>
    Cc: Linus Torvalds <torvalds@linux-foundation.org>
    Signed-off-by: default avatarH. Peter Anvin <hpa@linux.intel.com>
    d75f1b39
xsave.c 10.9 KB