• Pekka Riikonen's avatar
    x86: Allow FPU to be used at interrupt time even with eagerfpu · 5187b28f
    Pekka Riikonen authored
    With the addition of eagerfpu the irq_fpu_usable() now returns false
    negatives especially in the case of ksoftirqd and interrupted idle task,
    two common cases for FPU use for example in networking/crypto.  With
    eagerfpu=off FPU use is possible in those contexts.  This is because of
    the eagerfpu check in interrupted_kernel_fpu_idle():
    
    ...
      * For now, with eagerfpu we will return interrupted kernel FPU
      * state as not-idle. TBD: Ideally we can change the return value
      * to something like __thread_has_fpu(current). But we need to
      * be careful of doing __thread_clear_has_fpu() before saving
      * the FPU etc for supporting nested uses etc. For now, take
      * the simple route!
    ...
     	if (use_eager_fpu())
     		return 0;
    
    As eagerfpu is automatically "on" on those CPUs that also have the
    features like AES-NI this patch changes the eagerfpu check to return 1 in
    case the kernel_fpu_begin() has not been said yet.  Once it has been the
    __thread_has_fpu() will start returning 0.
    
    Notice that with eagerfpu the __thread_has_fpu is always true initially.
    FPU use is thus always possible no matter what task is under us, unless
    the state has already been saved with kernel_fpu_begin().
    
    [ hpa: this is a performance regression, not a correctness regression,
      but since it can be quite serious on CPUs which need encryption at
      interrupt time I am marking this for urgent/stable. ]
    Signed-off-by: default avatarPekka Riikonen <priikone@iki.fi>
    Link: http://lkml.kernel.org/r/alpine.GSO.2.00.1305131356320.18@git.silcnet.org
    Cc: <stable@vger.kernel.org> v3.7+
    Signed-off-by: default avatarH. Peter Anvin <hpa@linux.intel.com>
    5187b28f
i387.c 13.7 KB