On Thu, Dec 27, 2018 at 11:20 AM Linux Kernel Mailing List <[email protected]> wrote: > > Commit: 12209993e98c5fa1855c467f22a24e3d5b8be205 > Parent: 2f2fcc40a961ed04f0e130803fbaa868c2899310 > Refname: refs/heads/master > Web: > https://git.kernel.org/torvalds/c/12209993e98c5fa1855c467f22a24e3d5b8be205 > Author: Sebastian Andrzej Siewior <[email protected]> > AuthorDate: Thu Nov 29 16:02:10 2018 +0100 > Committer: Borislav Petkov <[email protected]> > CommitDate: Tue Dec 4 12:37:28 2018 +0100 > > x86/fpu: Don't export __kernel_fpu_{begin,end}() > > There is one user of __kernel_fpu_begin() and before invoking it, > it invokes preempt_disable(). So it could invoke kernel_fpu_begin() > right away. The 32bit version of arch_efi_call_virt_setup() and > arch_efi_call_virt_teardown() does this already. > > The comment above *kernel_fpu*() claims that before invoking > __kernel_fpu_begin() preemption should be disabled and that KVM is a > good example of doing it. Well, KVM doesn't do that since commit > > f775b13eedee2 ("x86,kvm: move qemu/guest FPU switching out to vcpu_run") > > so it is not an example anymore. > > With EFI gone as the last user of __kernel_fpu_{begin|end}(), both can > be made static and not exported anymore. > > Signed-off-by: Sebastian Andrzej Siewior <[email protected]> > Signed-off-by: Borislav Petkov <[email protected]> > Reviewed-by: Rik van Riel <[email protected]> > Cc: "H. Peter Anvin" <[email protected]> > Cc: "Jason A. Donenfeld" <[email protected]> > Cc: Andy Lutomirski <[email protected]> > Cc: Ard Biesheuvel <[email protected]> > Cc: Dave Hansen <[email protected]> > Cc: Ingo Molnar <[email protected]> > Cc: Nicolai Stange <[email protected]> > Cc: Paolo Bonzini <[email protected]> > Cc: Radim Krčmář <[email protected]> > Cc: Thomas Gleixner <[email protected]> > Cc: kvm ML <[email protected]> > Cc: linux-efi <[email protected]> > Cc: x86-ml <[email protected]> > Link: > https://lkml.kernel.org/r/[email protected] > --- > arch/x86/include/asm/efi.h | 6 ++---- > arch/x86/include/asm/fpu/api.h | 15 +++++---------- > arch/x86/kernel/fpu/core.c | 6 ++---- > 3 files changed, 9 insertions(+), 18 deletions(-) > > diff --git a/arch/x86/include/asm/efi.h b/arch/x86/include/asm/efi.h > index eea40d52ca78..45864898f7e5 100644 > --- a/arch/x86/include/asm/efi.h > +++ b/arch/x86/include/asm/efi.h > @@ -82,8 +82,7 @@ struct efi_scratch { > #define arch_efi_call_virt_setup() \ > ({ \ > efi_sync_low_kernel_mappings(); \ > - preempt_disable(); \ > - __kernel_fpu_begin(); \ > + kernel_fpu_begin(); \ > firmware_restrict_branch_speculation_start(); \ > \ > if (!efi_enabled(EFI_OLD_MEMMAP)) \ > @@ -99,8 +98,7 @@ struct efi_scratch { > efi_switch_mm(efi_scratch.prev_mm); \ > \ > firmware_restrict_branch_speculation_end(); \ > - __kernel_fpu_end(); \ > - preempt_enable(); \ > + kernel_fpu_end(); \ > }) > > extern void __iomem *__init efi_ioremap(unsigned long addr, unsigned long > size, > diff --git a/arch/x86/include/asm/fpu/api.h b/arch/x86/include/asm/fpu/api.h > index a9caac9d4a72..b56d504af654 100644 > --- a/arch/x86/include/asm/fpu/api.h > +++ b/arch/x86/include/asm/fpu/api.h > @@ -12,17 +12,12 @@ > #define _ASM_X86_FPU_API_H > > /* > - * Careful: __kernel_fpu_begin/end() must be called with preempt disabled > - * and they don't touch the preempt state on their own. > - * If you enable preemption after __kernel_fpu_begin(), preempt notifier > - * should call the __kernel_fpu_end() to prevent the kernel/user FPU > - * state from getting corrupted. KVM for example uses this model. > - * > - * All other cases use kernel_fpu_begin/end() which disable preemption > - * during kernel FPU usage. > + * Use kernel_fpu_begin/end() if you intend to use FPU in kernel context. It > + * disables preemption so be careful if you intend to use it for long periods > + * of time. > + * If you intend to use the FPU in softirq you need to check first with > + * irq_fpu_usable() if it is possible. > */ > -extern void __kernel_fpu_begin(void); > -extern void __kernel_fpu_end(void); > extern void kernel_fpu_begin(void); > extern void kernel_fpu_end(void); > extern bool irq_fpu_usable(void); > diff --git a/arch/x86/kernel/fpu/core.c b/arch/x86/kernel/fpu/core.c > index 2ea85b32421a..2e5003fef51a 100644 > --- a/arch/x86/kernel/fpu/core.c > +++ b/arch/x86/kernel/fpu/core.c > @@ -93,7 +93,7 @@ bool irq_fpu_usable(void) > } > EXPORT_SYMBOL(irq_fpu_usable); > > -void __kernel_fpu_begin(void) > +static void __kernel_fpu_begin(void) > { > struct fpu *fpu = ¤t->thread.fpu; > > @@ -111,9 +111,8 @@ void __kernel_fpu_begin(void) > __cpu_invalidate_fpregs_state(); > } > } > -EXPORT_SYMBOL(__kernel_fpu_begin); > > -void __kernel_fpu_end(void) > +static void __kernel_fpu_end(void) > { > struct fpu *fpu = ¤t->thread.fpu; > > @@ -122,7 +121,6 @@ void __kernel_fpu_end(void) > > kernel_fpu_enable(); > } > -EXPORT_SYMBOL(__kernel_fpu_end); > > void kernel_fpu_begin(void) > {
This commit removes an exported function pair that is currently used by out of tree modules, while the replacement pair (kernel_fpu_begin/end) is EXPORT_SYMBOL_GPL. So this is making existing functionality GPL only, which will probably be an issue for several out of tree modules that use the fpu. Could kernel_fpu_begin/end be made plain EXPORT_SYMBOL? Marc

