lkml.org 
[lkml]   [2015]   [Feb]   [19]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    Date
    From
    Subject[tip:x86/fpu] x86/fpu: Also check fpu_lazy_restore() when use_eager_fpu()
    Commit-ID:  728e53fef429a0f3c9dda3587c3ccc57ad268b70
    Gitweb: http://git.kernel.org/tip/728e53fef429a0f3c9dda3587c3ccc57ad268b70
    Author: Rik van Riel <riel@redhat.com>
    AuthorDate: Fri, 6 Feb 2015 15:02:05 -0500
    Committer: Borislav Petkov <bp@suse.de>
    CommitDate: Thu, 19 Feb 2015 11:15:55 +0100

    x86/fpu: Also check fpu_lazy_restore() when use_eager_fpu()

    With Oleg's patch:

    33a3ebdc077f ("x86, fpu: Don't abuse has_fpu in __kernel_fpu_begin/end()")

    kernel threads no longer have an FPU state even on systems with
    use_eager_fpu().

    That in turn means that a task may still have its FPU state
    loaded in the FPU registers, if the task only got interrupted by
    kernel threads from when it went to sleep, to when it woke up
    again.

    In that case, there is no need to restore the FPU state for
    this task, since it is still in the registers.

    The kernel can simply use the same logic to determine this as
    is used for !use_eager_fpu() systems.

    Signed-off-by: Rik van Riel <riel@redhat.com>
    Cc: Linus Torvalds <torvalds@linux-foundation.org>
    Cc: Oleg Nesterov <oleg@redhat.com>
    Link: http://lkml.kernel.org/r/1423252925-14451-9-git-send-email-riel@redhat.com
    Signed-off-by: Borislav Petkov <bp@suse.de>
    ---
    arch/x86/include/asm/fpu-internal.h | 2 +-
    1 file changed, 1 insertion(+), 1 deletion(-)

    diff --git a/arch/x86/include/asm/fpu-internal.h b/arch/x86/include/asm/fpu-internal.h
    index e5f8f8e..19fb41c 100644
    --- a/arch/x86/include/asm/fpu-internal.h
    +++ b/arch/x86/include/asm/fpu-internal.h
    @@ -458,7 +458,7 @@ static inline fpu_switch_t switch_fpu_prepare(struct task_struct *old, struct ta
    task_disable_lazy_fpu_restore(old);
    if (fpu.preload) {
    new->thread.fpu_counter++;
    - if (!use_eager_fpu() && fpu_lazy_restore(new, cpu))
    + if (fpu_lazy_restore(new, cpu))
    fpu.preload = 0;
    else
    prefetch(new->thread.fpu.state);

    \
     
     \ /
      Last update: 2015-02-19 12:41    [W:2.769 / U:0.436 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site