Re: [PATCH v2 4/4] x86/fpu/64: Don't FNINIT in kernel_fpu_begin()

From: Borislav Petkov
Date: Wed Jan 20 2021 - 13:42:44 EST


On Wed, Jan 20, 2021 at 11:07:11AM +0100, Peter Zijlstra wrote:
> On Tue, Jan 19, 2021 at 09:39:02AM -0800, Andy Lutomirski wrote:
> > The remaining callers of kernel_fpu_begin() in 64-bit kernels don't use 387
> > instructions, so there's no need to sanitize the FPU state. Skip it to get
> > most of the performance we lost back.
> >
> > Reported-by: Krzysztof Olędzki <ole@xxxxxx>
> > Signed-off-by: Andy Lutomirski <luto@xxxxxxxxxx>
> > ---
> > arch/x86/include/asm/fpu/api.h | 12 ++++++++++++
> > 1 file changed, 12 insertions(+)
> >
> > diff --git a/arch/x86/include/asm/fpu/api.h b/arch/x86/include/asm/fpu/api.h
> > index 38f4936045ab..435bc59d539b 100644
> > --- a/arch/x86/include/asm/fpu/api.h
> > +++ b/arch/x86/include/asm/fpu/api.h
> > @@ -32,7 +32,19 @@ extern void fpregs_mark_activate(void);
> > /* Code that is unaware of kernel_fpu_begin_mask() can use this */
> > static inline void kernel_fpu_begin(void)
> > {
> > +#ifdef CONFIG_X86_64
> > + /*
> > + * Any 64-bit code that uses 387 instructions must explicitly request
> > + * KFPU_387.
> > + */
> > + kernel_fpu_begin_mask(KFPU_MXCSR);
>
> I'm also still sitting on this:
>
> git://git.kernel.org/pub/scm/linux/kernel/git/peterz/queue.git x86/fpu
>
> what do we do with that?

Yah, I'd prefer an actual explicit check infra for stuff like that
instead of us expecting callers to know what bits they would need to
supply in the mask and then inadvertently goofing it up, leading to
funky context corruption bugs...

--
Regards/Gruss,
Boris.

https://people.kernel.org/tglx/notes-about-netiquette