Skip to content

Commit

Permalink
powerpc: create flush_all_to_thread()
Browse files Browse the repository at this point in the history
Create a single function that flushes everything (FP, VMX, VSX, SPE).
Doing this all at once means we only do one MSR write.

Signed-off-by: Anton Blanchard <anton@samba.org>
Signed-off-by: Michael Ellerman <mpe@ellerman.id.au>
  • Loading branch information
Anton Blanchard authored and Michael Ellerman committed Dec 2, 2015
1 parent c208505 commit 579e633
Show file tree
Hide file tree
Showing 4 changed files with 22 additions and 10 deletions.
1 change: 1 addition & 0 deletions arch/powerpc/include/asm/switch_to.h
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,7 @@ extern void giveup_vsx(struct task_struct *);
extern void enable_kernel_spe(void);
extern void load_up_spe(struct task_struct *);
extern void giveup_all(struct task_struct *);
extern void flush_all_to_thread(struct task_struct *);
extern void switch_booke_debug_regs(struct debug_reg *new_debug);

#ifdef CONFIG_PPC_FPU
Expand Down
22 changes: 18 additions & 4 deletions arch/powerpc/kernel/process.c
Original file line number Diff line number Diff line change
Expand Up @@ -367,6 +367,23 @@ void giveup_all(struct task_struct *tsk)
}
EXPORT_SYMBOL(giveup_all);

void flush_all_to_thread(struct task_struct *tsk)
{
if (tsk->thread.regs) {
preempt_disable();
BUG_ON(tsk != current);
giveup_all(tsk);

#ifdef CONFIG_SPE
if (tsk->thread.regs->msr & MSR_SPE)
tsk->thread.spefscr = mfspr(SPRN_SPEFSCR);
#endif

preempt_enable();
}
}
EXPORT_SYMBOL(flush_all_to_thread);

#ifdef CONFIG_PPC_ADV_DEBUG_REGS
void do_send_trap(struct pt_regs *regs, unsigned long address,
unsigned long error_code, int signal_code, int breakpt)
Expand Down Expand Up @@ -1137,10 +1154,7 @@ release_thread(struct task_struct *t)
*/
int arch_dup_task_struct(struct task_struct *dst, struct task_struct *src)
{
flush_fp_to_thread(src);
flush_altivec_to_thread(src);
flush_vsx_to_thread(src);
flush_spe_to_thread(src);
flush_all_to_thread(src);
/*
* Flush TM state out so we can copy it. __switch_to_tm() does this
* flush but it removes the checkpointed state from the current CPU and
Expand Down
4 changes: 1 addition & 3 deletions arch/powerpc/kernel/swsusp.c
Original file line number Diff line number Diff line change
Expand Up @@ -20,9 +20,7 @@ void save_processor_state(void)
* flush out all the special registers so we don't need
* to save them in the snapshot
*/
flush_fp_to_thread(current);
flush_altivec_to_thread(current);
flush_spe_to_thread(current);
flush_all_to_thread(current);

#ifdef CONFIG_PPC64
hard_irq_disable();
Expand Down
5 changes: 2 additions & 3 deletions arch/powerpc/kvm/book3s_hv.c
Original file line number Diff line number Diff line change
Expand Up @@ -2700,9 +2700,8 @@ static int kvmppc_vcpu_run_hv(struct kvm_run *run, struct kvm_vcpu *vcpu)
goto out;
}

flush_fp_to_thread(current);
flush_altivec_to_thread(current);
flush_vsx_to_thread(current);
flush_all_to_thread(current);

vcpu->arch.wqp = &vcpu->arch.vcore->wq;
vcpu->arch.pgdir = current->mm->pgd;
vcpu->arch.state = KVMPPC_VCPU_BUSY_IN_HOST;
Expand Down

0 comments on commit 579e633

Please sign in to comment.