*  - switch_fpu_prepare() saves the old state.
   *    This is done within the context of the old process.
   *
-  *  - switch_fpu_finish() restores the new state as
-  *    necessary.
+  *  - switch_fpu_finish() sets TIF_NEED_FPU_LOAD; the floating point state
+  *    will get loaded on return to userspace, or when the kernel needs it.
+  *
+  * If TIF_NEED_FPU_LOAD is cleared then the CPU's FPU registers
+  * are saved in the current thread's FPU register state.
+  *
+  * If TIF_NEED_FPU_LOAD is set then CPU's FPU registers may not
+  * hold current()'s FPU registers. It is required to load the
+  * registers before returning to userland or using the content
+  * otherwise.
+  *
+  * The FPU context is only stored/restored for a user task and
+  * ->mm is used to distinguish between kernel and user threads.
   */
 -static inline void
 -switch_fpu_prepare(struct fpu *old_fpu, int cpu)
 +static inline void switch_fpu_prepare(struct fpu *old_fpu, int cpu)
  {
-       if (static_cpu_has(X86_FEATURE_FPU) && old_fpu->initialized) {
+       if (static_cpu_has(X86_FEATURE_FPU) && current->mm) {
                if (!copy_fpregs_to_fpstate(old_fpu))
                        old_fpu->last_cpu = -1;
                else