Skip to content

Commit 7b89149

Browse files
authored
Linux 6.2 compat: add check for kernel_neon_* availability
This patch adds check for `kernel_neon_*` symbols on arm and arm64 platforms to address the following issues: 1. Linux 6.2+ on arm64 has exported them with `EXPORT_SYMBOL_GPL`, so license compatibility must be checked before use. 2. On both arm and arm64, the definitions of these symbols are guarded by `CONFIG_KERNEL_MODE_NEON`, but their declarations are still present. Checking in configuration phase only leads to MODPOST errors (undefined references). Reviewed-by: Brian Behlendorf <[email protected]> Signed-off-by: Shengqi Chen <[email protected]> Closes #15711 Closes #14555 Closes: #15401
1 parent 07e95b4 commit 7b89149

File tree

3 files changed

+32
-3
lines changed

3 files changed

+32
-3
lines changed

config/kernel-fpu.m4

Lines changed: 20 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -79,6 +79,12 @@ AC_DEFUN([ZFS_AC_KERNEL_SRC_FPU], [
7979
__kernel_fpu_end();
8080
], [], [ZFS_META_LICENSE])
8181
82+
ZFS_LINUX_TEST_SRC([kernel_neon], [
83+
#include <asm/neon.h>
84+
], [
85+
kernel_neon_begin();
86+
kernel_neon_end();
87+
], [], [ZFS_META_LICENSE])
8288
])
8389

8490
AC_DEFUN([ZFS_AC_KERNEL_FPU], [
@@ -105,9 +111,20 @@ AC_DEFUN([ZFS_AC_KERNEL_FPU], [
105111
AC_DEFINE(KERNEL_EXPORTS_X86_FPU, 1,
106112
[kernel exports FPU functions])
107113
],[
108-
AC_MSG_RESULT(internal)
109-
AC_DEFINE(HAVE_KERNEL_FPU_INTERNAL, 1,
110-
[kernel fpu internal])
114+
dnl #
115+
dnl # ARM neon symbols (only on arm and arm64)
116+
dnl # could be GPL-only on arm64 after Linux 6.2
117+
dnl #
118+
ZFS_LINUX_TEST_RESULT([kernel_neon_license],[
119+
AC_MSG_RESULT(kernel_neon_*)
120+
AC_DEFINE(HAVE_KERNEL_NEON, 1,
121+
[kernel has kernel_neon_* functions])
122+
],[
123+
# catch-all
124+
AC_MSG_RESULT(internal)
125+
AC_DEFINE(HAVE_KERNEL_FPU_INTERNAL, 1,
126+
[kernel fpu internal])
127+
])
111128
])
112129
])
113130
])

include/os/linux/kernel/linux/simd_aarch64.h

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -71,9 +71,15 @@
7171
#define ID_AA64PFR0_EL1 sys_reg(3, 0, 0, 1, 0)
7272
#define ID_AA64ISAR0_EL1 sys_reg(3, 0, 0, 6, 0)
7373

74+
#if (defined(HAVE_KERNEL_NEON) && defined(CONFIG_KERNEL_MODE_NEON))
7475
#define kfpu_allowed() 1
7576
#define kfpu_begin() kernel_neon_begin()
7677
#define kfpu_end() kernel_neon_end()
78+
#else
79+
#define kfpu_allowed() 0
80+
#define kfpu_begin() do {} while (0)
81+
#define kfpu_end() do {} while (0)
82+
#endif
7783
#define kfpu_init() (0)
7884
#define kfpu_fini() do {} while (0)
7985

include/os/linux/kernel/linux/simd_arm.h

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -53,9 +53,15 @@
5353
#include <asm/elf.h>
5454
#include <asm/hwcap.h>
5555

56+
#if (defined(HAVE_KERNEL_NEON) && defined(CONFIG_KERNEL_MODE_NEON))
5657
#define kfpu_allowed() 1
5758
#define kfpu_begin() kernel_neon_begin()
5859
#define kfpu_end() kernel_neon_end()
60+
#else
61+
#define kfpu_allowed() 0
62+
#define kfpu_begin() do {} while (0)
63+
#define kfpu_end() do {} while (0)
64+
#endif
5965
#define kfpu_init() (0)
6066
#define kfpu_fini() do {} while (0)
6167

0 commit comments

Comments
 (0)