From becdcec7b9cd6b8beaa2273495b97c06de24e9e5 Mon Sep 17 00:00:00 2001 From: Tony Hutter Date: Wed, 6 Mar 2019 16:03:03 -0800 Subject: [PATCH] kernel_fpu fixes This patch fixes a few issues when detecting which kernel_fpu functions are available. - Use kernel_fpu_begin() if it's exported on newer kernels. - Use ZFS_LINUX_TRY_COMPILE_SYMBOL() to choose the right kernel_fpu function when using --enable-linux-builtin. Reviewed-by: Brian Behlendorf Signed-off-by: Tony Hutter Closes #8259 Closes #8363 --- config/kernel-fpu.m4 | 34 +++++++++++++++++++++++++++++----- include/linux/simd_x86.h | 11 ++++++++--- 2 files changed, 37 insertions(+), 8 deletions(-) diff --git a/config/kernel-fpu.m4 b/config/kernel-fpu.m4 index 671fe7ea54..5fff79a74c 100644 --- a/config/kernel-fpu.m4 +++ b/config/kernel-fpu.m4 @@ -12,25 +12,49 @@ dnl # Pre-4.2: Use kernel_fpu_{begin,end}() dnl # HAVE_KERNEL_FPU & KERNEL_EXPORTS_X86_FPU dnl # AC_DEFUN([ZFS_AC_KERNEL_FPU], [ - AC_MSG_CHECKING([which kernel_fpu function to use]) + AC_MSG_CHECKING([which kernel_fpu header to use]) ZFS_LINUX_TRY_COMPILE([ + #include + #include + ],[ + ],[ + AC_DEFINE(HAVE_KERNEL_FPU_API_HEADER, 1, [kernel has asm/fpu/api.h]) + AC_MSG_RESULT(asm/fpu/api.h) + ],[ + AC_MSG_RESULT(i387.h & xcr.h) + ]) + + AC_MSG_CHECKING([which kernel_fpu function to use]) + ZFS_LINUX_TRY_COMPILE_SYMBOL([ + #include + #ifdef HAVE_KERNEL_FPU_API_HEADER + #include + #else #include #include + #endif + MODULE_LICENSE("$ZFS_META_LICENSE"); ],[ kernel_fpu_begin(); kernel_fpu_end(); - ],[ + ], [kernel_fpu_begin], [arch/x86/kernel/fpu/core.c], [ AC_MSG_RESULT(kernel_fpu_*) AC_DEFINE(HAVE_KERNEL_FPU, 1, [kernel has kernel_fpu_* functions]) AC_DEFINE(KERNEL_EXPORTS_X86_FPU, 1, [kernel exports FPU functions]) ],[ - ZFS_LINUX_TRY_COMPILE([ - #include + ZFS_LINUX_TRY_COMPILE_SYMBOL([ + #include + #ifdef HAVE_KERNEL_FPU_API_HEADER #include + #else + #include + #include + #endif + MODULE_LICENSE("$ZFS_META_LICENSE"); ],[ __kernel_fpu_begin(); __kernel_fpu_end(); - ],[ + ], [__kernel_fpu_begin], [arch/x86/kernel/fpu/core.c arch/x86/kernel/i387.c], [ AC_MSG_RESULT(__kernel_fpu_*) AC_DEFINE(HAVE_UNDERSCORE_KERNEL_FPU, 1, [kernel has __kernel_fpu_* functions]) AC_DEFINE(KERNEL_EXPORTS_X86_FPU, 1, [kernel exports FPU functions]) diff --git a/include/linux/simd_x86.h b/include/linux/simd_x86.h index 5d6fbed35b..12cd746778 100644 --- a/include/linux/simd_x86.h +++ b/include/linux/simd_x86.h @@ -81,9 +81,16 @@ #endif #if defined(_KERNEL) -#if defined(HAVE_UNDERSCORE_KERNEL_FPU) + +#if defined(HAVE_KERNEL_FPU_API_HEADER) #include #include +#else +#include +#include +#endif + +#if defined(HAVE_UNDERSCORE_KERNEL_FPU) #define kfpu_begin() \ { \ preempt_disable(); \ @@ -95,8 +102,6 @@ preempt_enable(); \ } #elif defined(HAVE_KERNEL_FPU) -#include -#include #define kfpu_begin() kernel_fpu_begin() #define kfpu_end() kernel_fpu_end() #else