powerpc: Rearrange __switch_to()
authorAnton Blanchard <anton@samba.org>
Thu, 29 Oct 2015 00:44:10 +0000 (11:44 +1100)
committerMichael Ellerman <mpe@ellerman.id.au>
Wed, 2 Dec 2015 08:34:41 +0000 (19:34 +1100)
Most of __switch_to() is housekeeping, TLB batching, timekeeping etc.
Move these away from the more complex and critical context switching
code.

Signed-off-by: Anton Blanchard <anton@samba.org>
Signed-off-by: Michael Ellerman <mpe@ellerman.id.au>
arch/powerpc/kernel/process.c

index 7f437e7b273e178d4d5d1112f4fe1415b2e1fd32..49424dc1168d9ffcdda5a37bd818249171da861c 100644 (file)
@@ -907,30 +907,6 @@ struct task_struct *__switch_to(struct task_struct *prev,
 
        WARN_ON(!irqs_disabled());
 
-       /*
-        * We need to save SPRs before treclaim/trecheckpoint as these will
-        * change a number of them.
-        */
-       save_sprs(&prev->thread);
-
-       __switch_to_tm(prev);
-
-       /* Save FPU, Altivec, VSX and SPE state */
-       giveup_all(prev);
-
-#ifdef CONFIG_PPC_ADV_DEBUG_REGS
-       switch_booke_debug_regs(&new->thread.debug);
-#else
-/*
- * For PPC_BOOK3S_64, we use the hw-breakpoint interfaces that would
- * schedule DABR
- */
-#ifndef CONFIG_HAVE_HW_BREAKPOINT
-       if (unlikely(!hw_brk_match(this_cpu_ptr(&current_brk), &new->thread.hw_brk)))
-               __set_breakpoint(&new->thread.hw_brk);
-#endif /* CONFIG_HAVE_HW_BREAKPOINT */
-#endif
-
 #ifdef CONFIG_PPC64
        /*
         * Collect processor utilization data per process
@@ -955,6 +931,30 @@ struct task_struct *__switch_to(struct task_struct *prev,
        }
 #endif /* CONFIG_PPC_BOOK3S_64 */
 
+#ifdef CONFIG_PPC_ADV_DEBUG_REGS
+       switch_booke_debug_regs(&new->thread.debug);
+#else
+/*
+ * For PPC_BOOK3S_64, we use the hw-breakpoint interfaces that would
+ * schedule DABR
+ */
+#ifndef CONFIG_HAVE_HW_BREAKPOINT
+       if (unlikely(!hw_brk_match(this_cpu_ptr(&current_brk), &new->thread.hw_brk)))
+               __set_breakpoint(&new->thread.hw_brk);
+#endif /* CONFIG_HAVE_HW_BREAKPOINT */
+#endif
+
+       /*
+        * We need to save SPRs before treclaim/trecheckpoint as these will
+        * change a number of them.
+        */
+       save_sprs(&prev->thread);
+
+       __switch_to_tm(prev);
+
+       /* Save FPU, Altivec, VSX and SPE state */
+       giveup_all(prev);
+
        /*
         * We can't take a PMU exception inside _switch() since there is a
         * window where the kernel stack SLB and the kernel stack are out
@@ -970,6 +970,8 @@ struct task_struct *__switch_to(struct task_struct *prev,
        old_thread = &last->thread;
        new_thread = &current->thread;
 
+       restore_sprs(old_thread, new_thread);
+
 #ifdef CONFIG_PPC_BOOK3S_64
        if (current_thread_info()->local_flags & _TLF_LAZY_MMU) {
                current_thread_info()->local_flags &= ~_TLF_LAZY_MMU;
@@ -978,8 +980,6 @@ struct task_struct *__switch_to(struct task_struct *prev,
        }
 #endif /* CONFIG_PPC_BOOK3S_64 */
 
-       restore_sprs(old_thread, new_thread);
-
        return last;
 }