• S
    x86, fpu: Check tsk_used_math() in kernel_fpu_end() for eager FPU · 731bd6a9
    Suresh Siddha 提交于
    For non-eager fpu mode, thread's fpu state is allocated during the first
    fpu usage (in the context of device not available exception). This
    (math_state_restore()) can be a blocking call and hence we enable
    interrupts (which were originally disabled when the exception happened),
    allocate memory and disable interrupts etc.
    
    But the eager-fpu mode, call's the same math_state_restore() from
    kernel_fpu_end(). The assumption being that tsk_used_math() is always
    set for the eager-fpu mode and thus avoid the code path of enabling
    interrupts, allocating fpu state using blocking call and disable
    interrupts etc.
    
    But the below issue was noticed by Maarten Baert, Nate Eldredge and
    few others:
    
    If a user process dumps core on an ecrypt fs while aesni-intel is loaded,
    we get a BUG() in __find_get_block() complaining that it was called with
    interrupts disabled; then all further accesses to our ecrypt fs hang
    and we have to reboot.
    
    The aesni-intel code (encrypting the core file that we are writing) needs
    the FPU and quite properly wraps its code in kernel_fpu_{begin,end}(),
    the latter of which calls math_state_restore(). So after kernel_fpu_end(),
    interrupts may be disabled, which nobody seems to expect, and they stay
    that way until we eventually get to __find_get_block() which barfs.
    
    For eager fpu, most the time, tsk_used_math() is true. At few instances
    during thread exit, signal return handling etc, tsk_used_math() might
    be false.
    
    In kernel_fpu_end(), for eager-fpu, call math_state_restore()
    only if tsk_used_math() is set. Otherwise, don't bother. Kernel code
    path which cleared tsk_used_math() knows what needs to be done
    with the fpu state.
    Reported-by: NMaarten Baert <maarten-baert@hotmail.com>
    Reported-by: NNate Eldredge <nate@thatsmathematics.com>
    Suggested-by: NLinus Torvalds <torvalds@linux-foundation.org>
    Signed-off-by: NSuresh Siddha <sbsiddha@gmail.com>
    Link: http://lkml.kernel.org/r/1391410583.3801.6.camel@europa
    Cc: George Spelvin <linux@horizon.com>
    Signed-off-by: NH. Peter Anvin <hpa@linux.intel.com>
    731bd6a9
i387.c 14.8 KB