Hi, Xuerui, On Sun, Mar 5, 2023 at 1:53 PM WANG Xuerui <kernel@xxxxxxxxxx> wrote: > > On 3/5/23 13:28, Huacai Chen wrote: > > Provide kernel_fpu_begin()/kernel_fpu_end() to let the kernel use fpu > > itself. They can be used by AMDGPU graphic driver for DCN. > > Grammar nit: "itself" is wrongly placed. "allow the kernel itself to use > FPU" could be better. > > Also the expected usage is way broader than a single driver's single > component. It's useful for a wide array of operations that will benefit > from SIMD acceleration support that'll hopefully appear later. For now > I'd suggest at least adding a single "e.g." after "used by" to signify > this, if you're not rewording the sentence. OK, I will update it. > > > > > Reported-by: Xuerui Wang <kernel@xxxxxxxxxx> > Thanks, but I prefer my name spelled in the native word order ;-) OK, I will correct it. > > Signed-off-by: Huacai Chen <chenhuacai@xxxxxxxxxxx> > > --- > > arch/loongarch/include/asm/fpu.h | 3 +++ > > arch/loongarch/kernel/Makefile | 2 +- > > arch/loongarch/kernel/kfpu.c | 41 ++++++++++++++++++++++++++++++++ > > 3 files changed, 45 insertions(+), 1 deletion(-) > > create mode 100644 arch/loongarch/kernel/kfpu.c > > > > diff --git a/arch/loongarch/include/asm/fpu.h b/arch/loongarch/include/asm/fpu.h > > index 358b254d9c1d..192f8e35d912 100644 > > --- a/arch/loongarch/include/asm/fpu.h > > +++ b/arch/loongarch/include/asm/fpu.h > > @@ -21,6 +21,9 @@ > > > > struct sigcontext; > > > > +extern void kernel_fpu_begin(void); > > +extern void kernel_fpu_end(void); > > + > > extern void _init_fpu(unsigned int); > > extern void _save_fp(struct loongarch_fpu *); > > extern void _restore_fp(struct loongarch_fpu *); > > diff --git a/arch/loongarch/kernel/Makefile b/arch/loongarch/kernel/Makefile > > index 78d4e3384305..9a72d91cd104 100644 > > --- a/arch/loongarch/kernel/Makefile > > +++ b/arch/loongarch/kernel/Makefile > > @@ -13,7 +13,7 @@ obj-y += head.o cpu-probe.o cacheinfo.o env.o setup.o entry.o genex.o \ > > obj-$(CONFIG_ACPI) += acpi.o > > obj-$(CONFIG_EFI) += efi.o > > > > -obj-$(CONFIG_CPU_HAS_FPU) += fpu.o > > +obj-$(CONFIG_CPU_HAS_FPU) += fpu.o kfpu.o > > > > obj-$(CONFIG_ARCH_STRICT_ALIGN) += unaligned.o > > > > diff --git a/arch/loongarch/kernel/kfpu.c b/arch/loongarch/kernel/kfpu.c > > new file mode 100644 > > index 000000000000..cd2a18fecdcc > > --- /dev/null > > +++ b/arch/loongarch/kernel/kfpu.c > > @@ -0,0 +1,41 @@ > > +// SPDX-License-Identifier: GPL-2.0-only > > +/* > > + * Copyright (C) 2020-2023 Loongson Technology Corporation Limited > > + */ > > + > > +#include <linux/cpu.h> > > +#include <linux/init.h> > > +#include <asm/fpu.h> > > +#include <asm/smp.h> > > + > > +static DEFINE_PER_CPU(bool, in_kernel_fpu); > > + > > +void kernel_fpu_begin(void) > > +{ > > + if(this_cpu_read(in_kernel_fpu)) > > + return; > Could be a conditional WARN_ON_ONCE like in arch/x86? > > + > > + preempt_disable(); > > + this_cpu_write(in_kernel_fpu, true); > > + > > + if (!is_fpu_owner()) > > + enable_fpu(); > > + else > > + _save_fp(¤t->thread.fpu); > > +} > > +EXPORT_SYMBOL_GPL(kernel_fpu_begin); > > Might be good to provide some explanation in the commit message as to > why the pair of helpers should be GPL-only. Do they touch state buried > deep enough to make any downstream user a "derivative work"? Or are the > annotation inspired by arch/x86? Yes, just inspired by arch/x86, and I don't think these symbols should be used by non-GPL modules. Huacai > > I think this kinda needs more thought, because similar operations like > arm's kernel_neon_{begin,end}, powerpc's enable_kernel_{fp,vsx,altivec} > or s390's __kernel_fpu_{begin,end} are not made GPL-only. Making these > helpers GPL-only precludes any non-GPL module to make use of SIMD on > LoongArch, which may or may not be what you want. This can have > commercial consequences so I can only leave the decision to you. > (Although IMO the semantics are encapsulated and high-level enough to > not warrant GPL-only marks, but it may well be the case that you have > thought of something else but didn't mention here.) > > > + > > +void kernel_fpu_end(void) > > +{ > > + if(!this_cpu_read(in_kernel_fpu)) > > + return; > > + > > + if (!is_fpu_owner()) > > + disable_fpu(); > > + else > > + _restore_fp(¤t->thread.fpu); > > + > > + this_cpu_write(in_kernel_fpu, false); > > + preempt_enable(); > > +} > > +EXPORT_SYMBOL_GPL(kernel_fpu_end); > > -- > WANG "xen0n" Xuerui > > Linux/LoongArch mailing list: https://lore.kernel.org/loongarch/ >