aboutsummaryrefslogtreecommitdiffstats
path: root/config
diff options
context:
space:
mode:
authorAttila Fülöp <[email protected]>2022-03-09 01:19:15 +0100
committerGitHub <[email protected]>2022-03-08 16:19:15 -0800
commitce7a5dbf4b37a0ba28dd6911e1a17f039fdd4f4e (patch)
tree99b992ce09e28646db7470fd3b179d37e05c9fbc /config
parenta86e089415679cf1b98eb424a159bb36aa2c19e3 (diff)
Linux x86 SIMD: factor out unneeded kernel dependencies
Cleanup the kernel SIMD code by removing kernel dependencies. - Replace XSTATE_XSAVE with our own XSAVE implementation for all kernels not exporting kernel_fpu{begin,end}(), see #13059 - Replace union fpregs_state by a uint8_t * buffer and get the size of the buffer from the hardware via the CPUID instruction - Replace kernels xgetbv() by our own implementation which was already there for userspace. Reviewed-by: Tony Hutter <[email protected]> Reviewed-by: Brian Behlendorf <[email protected]> Signed-off-by: Attila Fülöp <[email protected]> Closes #13102
Diffstat (limited to 'config')
-rw-r--r--config/kernel-fpu.m4105
1 files changed, 6 insertions, 99 deletions
diff --git a/config/kernel-fpu.m4 b/config/kernel-fpu.m4
index 7f8b028d0..eb9520c60 100644
--- a/config/kernel-fpu.m4
+++ b/config/kernel-fpu.m4
@@ -2,12 +2,6 @@ dnl #
dnl # Handle differences in kernel FPU code.
dnl #
dnl # Kernel
-dnl # 5.16: XCR code put into asm/fpu/xcr.h
-dnl # HAVE_KERNEL_FPU_XCR_HEADER
-dnl #
-dnl # XSTATE_XSAVE and XSTATE_XRESTORE aren't accessible any more
-dnl # HAVE_KERNEL_FPU_XSAVE_INTERNAL
-dnl #
dnl # 5.11: kernel_fpu_begin() is an inlined function now, so don't check
dnl # for it inside the kernel symbols.
dnl #
@@ -34,20 +28,8 @@ AC_DEFUN([ZFS_AC_KERNEL_FPU_HEADER], [
AC_DEFINE(HAVE_KERNEL_FPU_API_HEADER, 1,
[kernel has asm/fpu/api.h])
AC_MSG_RESULT(asm/fpu/api.h)
- AC_MSG_CHECKING([whether fpu/xcr header is available])
- ZFS_LINUX_TRY_COMPILE([
- #include <linux/module.h>
- #include <asm/fpu/xcr.h>
- ],[
- ],[
- AC_DEFINE(HAVE_KERNEL_FPU_XCR_HEADER, 1,
- [kernel has asm/fpu/xcr.h])
- AC_MSG_RESULT(asm/fpu/xcr.h)
- ],[
- AC_MSG_RESULT(no asm/fpu/xcr.h)
- ])
],[
- AC_MSG_RESULT(i387.h & xcr.h)
+ AC_MSG_RESULT(i387.h)
])
])
@@ -56,9 +38,9 @@ AC_DEFUN([ZFS_AC_KERNEL_SRC_FPU], [
#include <linux/types.h>
#ifdef HAVE_KERNEL_FPU_API_HEADER
#include <asm/fpu/api.h>
+ #include <asm/fpu/internal.h>
#else
#include <asm/i387.h>
- #include <asm/xcr.h>
#endif
], [
kernel_fpu_begin();
@@ -69,80 +51,15 @@ AC_DEFUN([ZFS_AC_KERNEL_SRC_FPU], [
#include <linux/types.h>
#ifdef HAVE_KERNEL_FPU_API_HEADER
#include <asm/fpu/api.h>
+ #include <asm/fpu/internal.h>
#else
#include <asm/i387.h>
- #include <asm/xcr.h>
#endif
], [
__kernel_fpu_begin();
__kernel_fpu_end();
], [], [ZFS_META_LICENSE])
- ZFS_LINUX_TEST_SRC([fpu_internal], [
- #if defined(__x86_64) || defined(__x86_64__) || \
- defined(__i386) || defined(__i386__)
- #if !defined(__x86)
- #define __x86
- #endif
- #endif
-
- #if !defined(__x86)
- #error Unsupported architecture
- #endif
-
- #include <linux/types.h>
- #ifdef HAVE_KERNEL_FPU_API_HEADER
- #include <asm/fpu/api.h>
- #include <asm/fpu/internal.h>
- #else
- #include <asm/i387.h>
- #include <asm/xcr.h>
- #endif
-
- #if !defined(XSTATE_XSAVE)
- #error XSTATE_XSAVE not defined
- #endif
-
- #if !defined(XSTATE_XRESTORE)
- #error XSTATE_XRESTORE not defined
- #endif
- ],[
- struct fpu *fpu = &current->thread.fpu;
- union fpregs_state *st = &fpu->state;
- struct fregs_state *fr __attribute__ ((unused)) = &st->fsave;
- struct fxregs_state *fxr __attribute__ ((unused)) = &st->fxsave;
- struct xregs_state *xr __attribute__ ((unused)) = &st->xsave;
- ])
-
- ZFS_LINUX_TEST_SRC([fpu_xsave_internal], [
- #include <linux/sched.h>
- #if defined(__x86_64) || defined(__x86_64__) || \
- defined(__i386) || defined(__i386__)
- #if !defined(__x86)
- #define __x86
- #endif
- #endif
-
- #if !defined(__x86)
- #error Unsupported architecture
- #endif
-
- #include <linux/types.h>
- #ifdef HAVE_KERNEL_FPU_API_HEADER
- #include <asm/fpu/api.h>
- #include <asm/fpu/internal.h>
- #else
- #include <asm/i387.h>
- #include <asm/xcr.h>
- #endif
-
- ],[
- struct fpu *fpu = &current->thread.fpu;
- union fpregs_state *st = &fpu->fpstate->regs;
- struct fregs_state *fr __attribute__ ((unused)) = &st->fsave;
- struct fxregs_state *fxr __attribute__ ((unused)) = &st->fxsave;
- struct xregs_state *xr __attribute__ ((unused)) = &st->xsave;
- ])
])
AC_DEFUN([ZFS_AC_KERNEL_FPU], [
@@ -169,19 +86,9 @@ AC_DEFUN([ZFS_AC_KERNEL_FPU], [
AC_DEFINE(KERNEL_EXPORTS_X86_FPU, 1,
[kernel exports FPU functions])
],[
- ZFS_LINUX_TEST_RESULT([fpu_internal], [
- AC_MSG_RESULT(internal)
- AC_DEFINE(HAVE_KERNEL_FPU_INTERNAL, 1,
- [kernel fpu internal])
- ],[
- ZFS_LINUX_TEST_RESULT([fpu_xsave_internal], [
- AC_MSG_RESULT(internal with internal XSAVE)
- AC_DEFINE(HAVE_KERNEL_FPU_XSAVE_INTERNAL, 1,
- [kernel fpu and XSAVE internal])
- ],[
- AC_MSG_RESULT(unavailable)
- ])
- ])
+ AC_MSG_RESULT(internal)
+ AC_DEFINE(HAVE_KERNEL_FPU_INTERNAL, 1,
+ [kernel fpu internal])
])
])
])