]> git.proxmox.com Git - mirror_zfs.git/blobdiff - config/kernel-fpu.m4
FreeBSD: Add zfs_link_create() error handling
[mirror_zfs.git] / config / kernel-fpu.m4
index a2c47d65a5aa23c6550a9388cf98394296c36351..edfde1a02d30ce8b296ecc20510a4fd8e2eb8a3f 100644 (file)
@@ -1,16 +1,16 @@
-dnl # 
+dnl #
 dnl # Handle differences in kernel FPU code.
 dnl #
 dnl # Kernel
-dnl # 5.2:     The fpu->initialized flag was replaced by TIF_NEED_FPU_LOAD.
-dnl #          HAVE_KERNEL_TIF_NEED_FPU_LOAD
+dnl # 5.19:    The asm/fpu/internal.h header was removed, it has been
+dnl #          effectively empty since the 5.16 kernel.
+dnl #
+dnl # 5.11:    kernel_fpu_begin() is an inlined function now, so don't check
+dnl #          for it inside the kernel symbols.
 dnl #
-dnl # 5.0:     As an optimization SIMD operations performed by kernel
-dnl #          threads can skip saving and restoring their FPU context.
-dnl #          Wrappers have been introduced to determine the running
-dnl #          context and use either the SIMD or generic implementation.
+dnl # 5.0:     Wrappers have been introduced to save/restore the FPU state.
 dnl #          This change was made to the 4.19.38 and 4.14.120 LTS kernels.
-dnl #          HAVE_KERNEL_FPU_INITIALIZED
+dnl #          HAVE_KERNEL_FPU_INTERNAL
 dnl #
 dnl # 4.2:     Use __kernel_fpu_{begin,end}()
 dnl #          HAVE_UNDERSCORE_KERNEL_FPU & KERNEL_EXPORTS_X86_FPU
@@ -30,53 +30,61 @@ 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)
+
+               ZFS_LINUX_TRY_COMPILE([
+                       #include <linux/module.h>
+                       #include <asm/fpu/internal.h>
+               ],[
+               ],[
+                       AC_DEFINE(HAVE_KERNEL_FPU_INTERNAL_HEADER, 1,
+                           [kernel has asm/fpu/internal.h])
+                       AC_MSG_RESULT([asm/fpu/api.h asm/fpu/internal.h])
+               ],[
+                       AC_MSG_RESULT([asm/fpu/api.h])
+               ])
        ],[
-               AC_MSG_RESULT(i387.h & xcr.h)
+               AC_MSG_RESULT([i387.h])
        ])
+
 ])
 
 AC_DEFUN([ZFS_AC_KERNEL_SRC_FPU], [
        ZFS_LINUX_TEST_SRC([kernel_fpu], [
+               #include <linux/types.h>
                #ifdef HAVE_KERNEL_FPU_API_HEADER
                #include <asm/fpu/api.h>
+               #ifdef HAVE_KERNEL_FPU_INTERNAL_HEADER
+               #include <asm/fpu/internal.h>
+               #endif
                #else
                #include <asm/i387.h>
-               #include <asm/xcr.h>
                #endif
        ], [
                kernel_fpu_begin();
                kernel_fpu_end();
-       ], [], [$ZFS_META_LICENSE])
+       ], [], [ZFS_META_LICENSE])
 
        ZFS_LINUX_TEST_SRC([__kernel_fpu], [
+               #include <linux/types.h>
                #ifdef HAVE_KERNEL_FPU_API_HEADER
                #include <asm/fpu/api.h>
+               #ifdef HAVE_KERNEL_FPU_INTERNAL_HEADER
+               #include <asm/fpu/internal.h>
+               #endif
                #else
                #include <asm/i387.h>
-               #include <asm/xcr.h>
                #endif
        ], [
                __kernel_fpu_begin();
                __kernel_fpu_end();
-       ], [], [$ZFS_META_LICENSE])
-
-       ZFS_LINUX_TEST_SRC([fpu_initialized], [
-               #include <linux/module.h>
-               #include <linux/sched.h>
-       ],[
-               struct fpu *fpu = &current->thread.fpu;
-               if (fpu->initialized) { return (0); };
-       ])
+       ], [], [ZFS_META_LICENSE])
 
-       ZFS_LINUX_TEST_SRC([tif_need_fpu_load], [
-               #include <linux/module.h>
-               #include <asm/thread_info.h>
-
-               #if !defined(TIF_NEED_FPU_LOAD)
-               #error "TIF_NEED_FPU_LOAD undefined"
-               #endif
-       ],[])
+       ZFS_LINUX_TEST_SRC([kernel_neon], [
+               #include <asm/neon.h>
+       ], [
+               kernel_neon_begin();
+               kernel_neon_end();
+       ], [], [ZFS_META_LICENSE])
 ])
 
 AC_DEFUN([ZFS_AC_KERNEL_FPU], [
@@ -84,8 +92,7 @@ AC_DEFUN([ZFS_AC_KERNEL_FPU], [
        dnl # Legacy kernel
        dnl #
        AC_MSG_CHECKING([whether kernel fpu is available])
-       ZFS_LINUX_TEST_RESULT_SYMBOL([kernel_fpu_license],
-           [kernel_fpu_begin], [arch/x86/kernel/fpu/core.c], [
+       ZFS_LINUX_TEST_RESULT([kernel_fpu_license], [
                AC_MSG_RESULT(kernel_fpu_*)
                AC_DEFINE(HAVE_KERNEL_FPU, 1,
                    [kernel has kernel_fpu_* functions])
@@ -105,24 +112,18 @@ AC_DEFUN([ZFS_AC_KERNEL_FPU], [
                            [kernel exports FPU functions])
                ],[
                        dnl #
-                       dnl # Linux 5.0 kernel
+                       dnl # ARM neon symbols (only on arm and arm64)
+                       dnl # could be GPL-only on arm64 after Linux 6.2
                        dnl #
-                       ZFS_LINUX_TEST_RESULT([fpu_initialized], [
-                               AC_MSG_RESULT(fpu.initialized)
-                               AC_DEFINE(HAVE_KERNEL_FPU_INITIALIZED, 1,
-                                   [kernel fpu.initialized exists])
+                       ZFS_LINUX_TEST_RESULT([kernel_neon_license],[
+                               AC_MSG_RESULT(kernel_neon_*)
+                               AC_DEFINE(HAVE_KERNEL_NEON, 1,
+                                   [kernel has kernel_neon_* functions])
                        ],[
-                               dnl #
-                               dnl # Linux 5.2 kernel
-                               dnl #
-                               ZFS_LINUX_TEST_RESULT([tif_need_fpu_load], [
-                                       AC_MSG_RESULT(TIF_NEED_FPU_LOAD)
-                                       AC_DEFINE(
-                                           HAVE_KERNEL_TIF_NEED_FPU_LOAD, 1,
-                                           [kernel TIF_NEED_FPU_LOAD exists])
-                               ],[
-                                       AC_MSG_RESULT(unavailable)
-                               ])
+                               # catch-all
+                               AC_MSG_RESULT(internal)
+                               AC_DEFINE(HAVE_KERNEL_FPU_INTERNAL, 1,
+                                   [kernel fpu internal])
                        ])
                ])
        ])