• Linus Torvalds's avatar
    i387: re-introduce FPU state preloading at context switch time · 34ddc81a
    Linus Torvalds authored
    After all the FPU state cleanups and finally finding the problem that
    caused all our FPU save/restore problems, this re-introduces the
    preloading of FPU state that was removed in commit b3b0870e ("i387:
    do not preload FPU state at task switch time").
    
    However, instead of simply reverting the removal, this reimplements
    preloading with several fixes, most notably
    
     - properly abstracted as a true FPU state switch, rather than as
       open-coded save and restore with various hacks.
    
       In particular, implementing it as a proper FPU state switch allows us
       to optimize the CR0.TS flag accesses: there is no reason to set the
       TS bit only to then almost immediately clear it again.  CR0 accesses
       are quite slow and expensive, don't flip the bit back and forth for
       no good reason.
    
     - Make sure that the same model works for both x86-32 and x86-64, so
       that there are no gratuitous differences between the two due to the
       way they save and restore segment state differently due to
       architectural differences that really don't matter to the FPU state.
    
     - Avoid exposing the "preload" state to the context switch routines,
       and in particular allow the concept of lazy state restore: if nothing
       else has used the FPU in the meantime, and the process is still on
       the same CPU, we can avoid restoring state from memory entirely, just
       re-expose the state that is still in the FPU unit.
    
       That optimized lazy restore isn't actually implemented here, but the
       infrastructure is set up for it.  Of course, older CPU's that use
       'fnsave' to save the state cannot take advantage of this, since the
       state saving also trashes the state.
    
    In other words, there is now an actual _design_ to the FPU state saving,
    rather than just random historical baggage.  Hopefully it's easier to
    follow as a result.
    Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
    34ddc81a
process_64.c 15.5 KB