[PATCH resend 03/15] arm64: defer reloading a task's FPSIMD state to userland resume
Catalin Marinas
catalin.marinas at arm.com
Tue May 6 09:08:26 PDT 2014
On Thu, May 01, 2014 at 04:49:35PM +0100, Ard Biesheuvel wrote:
> @@ -153,12 +252,11 @@ static int fpsimd_cpu_pm_notifier(struct notifier_block *self,
> {
> switch (cmd) {
> case CPU_PM_ENTER:
> - if (current->mm)
> + if (current->mm && !test_thread_flag(TIF_FOREIGN_FPSTATE))
> fpsimd_save_state(¤t->thread.fpsimd_state);
> break;
> case CPU_PM_EXIT:
> - if (current->mm)
> - fpsimd_load_state(¤t->thread.fpsimd_state);
> + set_thread_flag(TIF_FOREIGN_FPSTATE);
I think we could enter a PM state on a kernel thread (idle), so we
should preserve the current->mm check as well.
> break;
> case CPU_PM_ENTER_FAILED:
> default:
> diff --git a/arch/arm64/kernel/signal.c b/arch/arm64/kernel/signal.c
> index 06448a77ff53..882f01774365 100644
> --- a/arch/arm64/kernel/signal.c
> +++ b/arch/arm64/kernel/signal.c
> @@ -413,4 +413,8 @@ asmlinkage void do_notify_resume(struct pt_regs *regs,
> clear_thread_flag(TIF_NOTIFY_RESUME);
> tracehook_notify_resume(regs);
> }
> +
> + if (thread_flags & _TIF_FOREIGN_FPSTATE)
> + fpsimd_restore_current_state();
I think this should be safe. Even if we get preempted here, ret_to_user
would loop over TI_FLAGS with interrupts disabled until no work pending.
--
Catalin
More information about the linux-arm-kernel
mailing list