powerpc: Rearrange __switch_to()
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>
This commit is contained in:
parent
579e633e76
commit
f3d885ccba
|
@ -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(¤t_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(¤t_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 = ¤t->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;
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in New Issue