diff options
author | Attila Fülöp <[email protected]> | 2022-03-09 01:19:15 +0100 |
---|---|---|
committer | GitHub <[email protected]> | 2022-03-08 16:19:15 -0800 |
commit | ce7a5dbf4b37a0ba28dd6911e1a17f039fdd4f4e (patch) | |
tree | 99b992ce09e28646db7470fd3b179d37e05c9fbc /config | |
parent | a86e089415679cf1b98eb424a159bb36aa2c19e3 (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.m4 | 105 |
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 = ¤t->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 = ¤t->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]) ]) ]) ]) |