From 5b009301f4e4a6d049b04ecb3d7e33836093213d Mon Sep 17 00:00:00 2001 From: Ryan Moeller Date: Thu, 8 Sep 2022 13:57:55 +0000 Subject: [PATCH] Provide kfpu_begin/end from spl Jira: NAS-115648 --- config/kernel-fpu.m4 | 8 +-- include/os/linux/kernel/linux/simd_x86.h | 25 +------- module/Kbuild.in | 1 + module/os/linux/spl/spl-kfpu.c | 75 ++++++++++++++++++++++++ 4 files changed, 82 insertions(+), 27 deletions(-) create mode 100644 module/os/linux/spl/spl-kfpu.c diff --git a/config/kernel-fpu.m4 b/config/kernel-fpu.m4 index edfde1a02d..f419f29825 100644 --- a/config/kernel-fpu.m4 +++ b/config/kernel-fpu.m4 @@ -62,7 +62,7 @@ AC_DEFUN([ZFS_AC_KERNEL_SRC_FPU], [ ], [ kernel_fpu_begin(); kernel_fpu_end(); - ], [], [ZFS_META_LICENSE]) + ], [], []) ZFS_LINUX_TEST_SRC([__kernel_fpu], [ #include @@ -77,7 +77,7 @@ AC_DEFUN([ZFS_AC_KERNEL_SRC_FPU], [ ], [ __kernel_fpu_begin(); __kernel_fpu_end(); - ], [], [ZFS_META_LICENSE]) + ], [], []) ZFS_LINUX_TEST_SRC([kernel_neon], [ #include @@ -92,7 +92,7 @@ AC_DEFUN([ZFS_AC_KERNEL_FPU], [ dnl # Legacy kernel dnl # AC_MSG_CHECKING([whether kernel fpu is available]) - ZFS_LINUX_TEST_RESULT([kernel_fpu_license], [ + ZFS_LINUX_TEST_RESULT([kernel_fpu], [ AC_MSG_RESULT(kernel_fpu_*) AC_DEFINE(HAVE_KERNEL_FPU, 1, [kernel has kernel_fpu_* functions]) @@ -102,7 +102,7 @@ AC_DEFUN([ZFS_AC_KERNEL_FPU], [ dnl # dnl # Linux 4.2 kernel dnl # - ZFS_LINUX_TEST_RESULT_SYMBOL([__kernel_fpu_license], + ZFS_LINUX_TEST_RESULT_SYMBOL([__kernel_fpu], [__kernel_fpu_begin], [arch/x86/kernel/fpu/core.c arch/x86/kernel/i387.c], [ AC_MSG_RESULT(__kernel_fpu_*) diff --git a/include/os/linux/kernel/linux/simd_x86.h b/include/os/linux/kernel/linux/simd_x86.h index 699b8a5718..4e99c2d1c2 100644 --- a/include/os/linux/kernel/linux/simd_x86.h +++ b/include/os/linux/kernel/linux/simd_x86.h @@ -106,29 +106,8 @@ #define kfpu_init() 0 #define kfpu_fini() ((void) 0) -#if defined(HAVE_UNDERSCORE_KERNEL_FPU) -#define kfpu_begin() \ -{ \ - preempt_disable(); \ - __kernel_fpu_begin(); \ -} -#define kfpu_end() \ -{ \ - __kernel_fpu_end(); \ - preempt_enable(); \ -} - -#elif defined(HAVE_KERNEL_FPU) -#define kfpu_begin() kernel_fpu_begin() -#define kfpu_end() kernel_fpu_end() - -#else -/* - * This case is unreachable. When KERNEL_EXPORTS_X86_FPU is defined then - * either HAVE_UNDERSCORE_KERNEL_FPU or HAVE_KERNEL_FPU must be defined. - */ -#error "Unreachable kernel configuration" -#endif +extern void kfpu_begin(void); +extern void kfpu_end(void); #else /* defined(KERNEL_EXPORTS_X86_FPU) */ diff --git a/module/Kbuild.in b/module/Kbuild.in index 94d6987b0a..b544ec7b9d 100644 --- a/module/Kbuild.in +++ b/module/Kbuild.in @@ -74,6 +74,7 @@ SPL_OBJS := \ spl-cred.o \ spl-err.o \ spl-generic.o \ + spl-kfpu.o \ spl-kmem-cache.o \ spl-kmem.o \ spl-kstat.o \ diff --git a/module/os/linux/spl/spl-kfpu.c b/module/os/linux/spl/spl-kfpu.c new file mode 100644 index 0000000000..9e781c9f76 --- /dev/null +++ b/module/os/linux/spl/spl-kfpu.c @@ -0,0 +1,75 @@ +/* + * Copyright (c) 2022 iXsystems, Inc. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHORS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ + +#ifdef KERNEL_EXPORTS_X86_FPU + +#include + +#if defined(HAVE_KERNEL_FPU) + +void +// cppcheck-suppress syntaxError +kfpu_begin(void) +{ + kernel_fpu_begin(); +} + +void +// cppcheck-suppress syntaxError +kfpu_end(void) +{ + kernel_fpu_end(); +} + +#elif defined(HAVE_UNDERSCORE_KERNEL_FPU) + +void +// cppcheck-suppress syntaxError +kfpu_begin(void) +{ + preempt_disable(); + __kernel_fpu_begin(); +} + +void +// cppcheck-suppress syntaxError +kfpu_end(void) +{ + __kernel_fpu_end(); + preempt_enable(); +} + +#else +/* + * This case should be unreachable. When KERNEL_EXPORTS_X86_FPU is defined + * then either HAVE_UNDERSCORE_KERNEL_FPU or HAVE_KERNEL_FPU must be defined. + */ +#error "Unreachable kernel configuration" +#endif + +EXPORT_SYMBOL(kfpu_begin); +EXPORT_SYMBOL(kfpu_end); + +#endif /* KERNEL_EXPORTS_X86_FPU */