Skip to content

Commit

Permalink
Provide kfpu_begin/end from spl
Browse files Browse the repository at this point in the history
Jira: NAS-115648
  • Loading branch information
Ryan Moeller authored and Ryan Moeller committed Sep 20, 2022
1 parent 88bdb2f commit 1dd0312
Show file tree
Hide file tree
Showing 4 changed files with 78 additions and 27 deletions.
8 changes: 4 additions & 4 deletions config/kernel-fpu.m4
Original file line number Diff line number Diff line change
Expand Up @@ -76,7 +76,7 @@ AC_DEFUN([ZFS_AC_KERNEL_SRC_FPU], [
], [
kernel_fpu_begin();
kernel_fpu_end();
], [], [ZFS_META_LICENSE])
], [], [])
ZFS_LINUX_TEST_SRC([__kernel_fpu], [
#include <linux/types.h>
Expand All @@ -89,7 +89,7 @@ AC_DEFUN([ZFS_AC_KERNEL_SRC_FPU], [
], [
__kernel_fpu_begin();
__kernel_fpu_end();
], [], [ZFS_META_LICENSE])
], [], [])
ZFS_LINUX_TEST_SRC([fpu_internal], [
#if defined(__x86_64) || defined(__x86_64__) || \
Expand Down Expand Up @@ -167,7 +167,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])
Expand All @@ -177,7 +177,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_*)
Expand Down
25 changes: 2 additions & 23 deletions include/os/linux/kernel/linux/simd_x86.h
Original file line number Diff line number Diff line change
Expand Up @@ -108,29 +108,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) */

Expand Down
1 change: 1 addition & 0 deletions module/os/linux/spl/Makefile.in
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@ $(MODULE)-objs += ../os/linux/spl/spl-condvar.o
$(MODULE)-objs += ../os/linux/spl/spl-cred.o
$(MODULE)-objs += ../os/linux/spl/spl-err.o
$(MODULE)-objs += ../os/linux/spl/spl-generic.o
$(MODULE)-objs += ../os/linux/spl/spl-kfpu.o
$(MODULE)-objs += ../os/linux/spl/spl-kmem.o
$(MODULE)-objs += ../os/linux/spl/spl-kmem-cache.o
$(MODULE)-objs += ../os/linux/spl/spl-kstat.o
Expand Down
71 changes: 71 additions & 0 deletions module/os/linux/spl/spl-kfpu.c
Original file line number Diff line number Diff line change
@@ -0,0 +1,71 @@
/*
* 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 <sys/simd.h>

#if defined(HAVE_KERNEL_FPU)

void
kfpu_begin(void)
{
kernel_fpu_begin();
}

void
kfpu_end(void)
{
kernel_fpu_end();
}

#elif defined(HAVE_UNDERSCORE_KERNEL_FPU)

void
kfpu_begin(void)
{
preempt_disable();
__kernel_fpu_begin();
}

void
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 */

0 comments on commit 1dd0312

Please sign in to comment.