[PATCH] powerpc/kernel: improve FP and vector registers restoration
Anton Blanchard
anton at samba.org
Sat Jun 3 08:04:11 AEST 2017
Hi Breno,
> Currently tsk->thread->load_vec and load_fp are not initialized
> during a task creation, which set garbage to these variables
> (non-zero value).
Nice catch! It seems like we should zero load_tm too though?
Acked-by: Anton Blanchard <anton at samba.org>
Anton
> These variables will be checked later at restore_math() to validate
> if the FP and vectors are being utilized. Since these values might be
> non-zero, the restore_math() will continue to save the FP and vectors
> even if they were never utilized before the userspace application.
> load_fp and load_vec counters will then overflow and the FP and
> Altivec will be finally disabled, but before that condition is
> reached (counter overflow) several context switches restored FP and
> vector registers without need, causing a performance degradation.
>
> Signed-off-by: Breno Leitao <leitao at debian.org>
> Signed-off-by: Gustavo Romero <gusbromero at gmail.com>
> ---
> arch/powerpc/kernel/process.c | 2 ++
> 1 file changed, 2 insertions(+)
>
> diff --git a/arch/powerpc/kernel/process.c
> b/arch/powerpc/kernel/process.c index baae104b16c7..a9435397eab8
> 100644 --- a/arch/powerpc/kernel/process.c
> +++ b/arch/powerpc/kernel/process.c
> @@ -1666,6 +1666,7 @@ void start_thread(struct pt_regs *regs,
> unsigned long start, unsigned long sp) #ifdef CONFIG_VSX
> current->thread.used_vsr = 0;
> #endif
> + current->thread.load_fp = 0;
> memset(¤t->thread.fp_state, 0,
> sizeof(current->thread.fp_state)); current->thread.fp_save_area =
> NULL; #ifdef CONFIG_ALTIVEC
> @@ -1674,6 +1675,7 @@ void start_thread(struct pt_regs *regs,
> unsigned long start, unsigned long sp) current->thread.vr_save_area =
> NULL; current->thread.vrsave = 0;
> current->thread.used_vr = 0;
> + current->thread.load_vec = 0;
> #endif /* CONFIG_ALTIVEC */
> #ifdef CONFIG_SPE
> memset(current->thread.evr, 0, sizeof(current->thread.evr));
More information about the Linuxppc-dev
mailing list