2 dnl # Default ZFS kernel configuration
4 AC_DEFUN([ZFS_AC_CONFIG_KERNEL], [
5 AM_COND_IF([BUILD_LINUX], [
6 dnl # Setup the kernel build environment.
10 dnl # Sanity checks for module building and CONFIG_* defines
11 ZFS_AC_KERNEL_CONFIG_DEFINED
14 dnl # Sequential ZFS_LINUX_TRY_COMPILE tests
15 ZFS_AC_KERNEL_FPU_HEADER
16 ZFS_AC_KERNEL_OBJTOOL_HEADER
17 ZFS_AC_KERNEL_MISC_MINOR
18 ZFS_AC_KERNEL_DECLARE_EVENT_CLASS
20 dnl # Parallel ZFS_LINUX_TEST_SRC / ZFS_LINUX_TEST_RESULT tests
21 ZFS_AC_KERNEL_TEST_SRC
22 ZFS_AC_KERNEL_TEST_RESULT
24 AS_IF([test "$LINUX_OBJ" != "$LINUX"], [
25 KERNEL_MAKE="$KERNEL_MAKE O=$LINUX_OBJ"
33 dnl # Generate and compile all of the kernel API test cases to determine
34 dnl # which interfaces are available. By invoking the kernel build system
35 dnl # only once the compilation can be done in parallel significantly
36 dnl # speeding up the process.
38 AC_DEFUN([ZFS_AC_KERNEL_TEST_SRC], [
39 ZFS_AC_KERNEL_SRC_TYPES
40 ZFS_AC_KERNEL_SRC_OBJTOOL
41 ZFS_AC_KERNEL_SRC_ACCESS_OK_TYPE
42 ZFS_AC_KERNEL_SRC_PDE_DATA
43 ZFS_AC_KERNEL_SRC_GENERIC_FADVISE
44 ZFS_AC_KERNEL_SRC_SCHED
45 ZFS_AC_KERNEL_SRC_USLEEP_RANGE
46 ZFS_AC_KERNEL_SRC_VMALLOC_PAGE_KERNEL
47 ZFS_AC_KERNEL_SRC_INODE_TIMES
48 ZFS_AC_KERNEL_SRC_PROC_OPERATIONS
49 ZFS_AC_KERNEL_SRC_BLOCK_DEVICE_OPERATIONS
51 ZFS_AC_KERNEL_SRC_BLKDEV
52 ZFS_AC_KERNEL_SRC_BLK_QUEUE
53 ZFS_AC_KERNEL_SRC_GENHD_FLAGS
54 ZFS_AC_KERNEL_SRC_REVALIDATE_DISK
55 ZFS_AC_KERNEL_SRC_GET_DISK_RO
56 ZFS_AC_KERNEL_SRC_DISCARD_GRANULARITY
57 ZFS_AC_KERNEL_SRC_INODE_OWNER_OR_CAPABLE
58 ZFS_AC_KERNEL_SRC_XATTR
60 ZFS_AC_KERNEL_SRC_INODE_SETATTR
61 ZFS_AC_KERNEL_SRC_INODE_GETATTR
62 ZFS_AC_KERNEL_SRC_SHOW_OPTIONS
63 ZFS_AC_KERNEL_SRC_SHRINKER
64 ZFS_AC_KERNEL_SRC_MKDIR
65 ZFS_AC_KERNEL_SRC_LOOKUP_FLAGS
66 ZFS_AC_KERNEL_SRC_CREATE
67 ZFS_AC_KERNEL_SRC_PERMISSION
68 ZFS_AC_KERNEL_SRC_TMPFILE
69 ZFS_AC_KERNEL_SRC_AUTOMOUNT
70 ZFS_AC_KERNEL_SRC_COMMIT_METADATA
71 ZFS_AC_KERNEL_SRC_SETATTR_PREPARE
72 ZFS_AC_KERNEL_SRC_INSERT_INODE_LOCKED
73 ZFS_AC_KERNEL_SRC_TRUNCATE_SETSIZE
74 ZFS_AC_KERNEL_SRC_SECURITY_INODE
75 ZFS_AC_KERNEL_SRC_FST_MOUNT
76 ZFS_AC_KERNEL_SRC_SET_NLINK
77 ZFS_AC_KERNEL_SRC_SGET
78 ZFS_AC_KERNEL_SRC_VFS_FILEMAP_DIRTY_FOLIO
79 ZFS_AC_KERNEL_SRC_VFS_READ_FOLIO
80 ZFS_AC_KERNEL_SRC_VFS_RELEASE_FOLIO
81 ZFS_AC_KERNEL_SRC_VFS_INVALIDATE_FOLIO
82 ZFS_AC_KERNEL_SRC_VFS_FSYNC_2ARGS
83 ZFS_AC_KERNEL_SRC_VFS_DIRECT_IO
84 ZFS_AC_KERNEL_SRC_VFS_READPAGES
85 ZFS_AC_KERNEL_SRC_VFS_SET_PAGE_DIRTY_NOBUFFERS
86 ZFS_AC_KERNEL_SRC_VFS_IOV_ITER
87 ZFS_AC_KERNEL_SRC_VFS_GENERIC_COPY_FILE_RANGE
88 ZFS_AC_KERNEL_SRC_VFS_SPLICE_COPY_FILE_RANGE
89 ZFS_AC_KERNEL_SRC_VFS_REMAP_FILE_RANGE
90 ZFS_AC_KERNEL_SRC_VFS_CLONE_FILE_RANGE
91 ZFS_AC_KERNEL_SRC_VFS_DEDUPE_FILE_RANGE
92 ZFS_AC_KERNEL_SRC_KMAP_ATOMIC_ARGS
93 ZFS_AC_KERNEL_SRC_KMAP_LOCAL_PAGE
94 ZFS_AC_KERNEL_SRC_FOLLOW_DOWN_ONE
95 ZFS_AC_KERNEL_SRC_MAKE_REQUEST_FN
96 ZFS_AC_KERNEL_SRC_GENERIC_IO_ACCT
98 ZFS_AC_KERNEL_SRC_FMODE_T
99 ZFS_AC_KERNEL_SRC_KUIDGID_T
100 ZFS_AC_KERNEL_SRC_KUID_HELPERS
101 ZFS_AC_KERNEL_SRC_RENAME
102 ZFS_AC_KERNEL_SRC_TOTALRAM_PAGES_FUNC
103 ZFS_AC_KERNEL_SRC_TOTALHIGH_PAGES
104 ZFS_AC_KERNEL_SRC_PERCPU
105 ZFS_AC_KERNEL_SRC_GENERIC_FILLATTR
106 ZFS_AC_KERNEL_SRC_MKNOD
107 ZFS_AC_KERNEL_SRC_SYMLINK
108 ZFS_AC_KERNEL_SRC_BIO_MAX_SEGS
109 ZFS_AC_KERNEL_SRC_SIGINFO
110 ZFS_AC_KERNEL_SRC_SYSFS
111 ZFS_AC_KERNEL_SRC_STANDALONE_LINUX_STDARG
112 ZFS_AC_KERNEL_SRC_STRLCPY
113 ZFS_AC_KERNEL_SRC_PAGEMAP_FOLIO_WAIT_BIT
114 ZFS_AC_KERNEL_SRC_ADD_DISK
115 ZFS_AC_KERNEL_SRC_KTHREAD
116 ZFS_AC_KERNEL_SRC_ZERO_PAGE
117 ZFS_AC_KERNEL_SRC___COPY_FROM_USER_INATOMIC
118 ZFS_AC_KERNEL_SRC_IDMAP_MNT_API
119 ZFS_AC_KERNEL_SRC_IDMAP_NO_USERNS
120 ZFS_AC_KERNEL_SRC_IATTR_VFSID
121 ZFS_AC_KERNEL_SRC_WRITEPAGE_T
122 ZFS_AC_KERNEL_SRC_RECLAIMED
123 ZFS_AC_KERNEL_SRC_REGISTER_SYSCTL_TABLE
124 ZFS_AC_KERNEL_SRC_REGISTER_SYSCTL_SZ
125 ZFS_AC_KERNEL_SRC_PROC_HANDLER_CTL_TABLE_CONST
126 ZFS_AC_KERNEL_SRC_COPY_SPLICE_READ
127 ZFS_AC_KERNEL_SRC_SYNC_BDEV
128 ZFS_AC_KERNEL_SRC_MM_PAGE_FLAGS
129 ZFS_AC_KERNEL_SRC_MM_PAGE_SIZE
130 ZFS_AC_KERNEL_SRC_MM_PAGE_MAPPING
131 ZFS_AC_KERNEL_SRC_FILE
134 ZFS_AC_KERNEL_SRC_CPU_HAS_FEATURE
135 ZFS_AC_KERNEL_SRC_FLUSH_DCACHE_PAGE
138 ZFS_AC_KERNEL_SRC_FLUSH_DCACHE_PAGE
142 AC_MSG_CHECKING([for available kernel interfaces])
143 ZFS_LINUX_TEST_COMPILE_ALL([kabi])
144 AC_MSG_RESULT([done])
148 dnl # Check results of kernel interface tests.
150 AC_DEFUN([ZFS_AC_KERNEL_TEST_RESULT], [
152 ZFS_AC_KERNEL_ACCESS_OK_TYPE
153 ZFS_AC_KERNEL_OBJTOOL
154 ZFS_AC_KERNEL_PDE_DATA
155 ZFS_AC_KERNEL_GENERIC_FADVISE
157 ZFS_AC_KERNEL_USLEEP_RANGE
158 ZFS_AC_KERNEL_VMALLOC_PAGE_KERNEL
159 ZFS_AC_KERNEL_INODE_TIMES
160 ZFS_AC_KERNEL_PROC_OPERATIONS
161 ZFS_AC_KERNEL_BLOCK_DEVICE_OPERATIONS
164 ZFS_AC_KERNEL_BLK_QUEUE
165 ZFS_AC_KERNEL_GENHD_FLAGS
166 ZFS_AC_KERNEL_REVALIDATE_DISK
167 ZFS_AC_KERNEL_GET_DISK_RO
168 ZFS_AC_KERNEL_DISCARD_GRANULARITY
169 ZFS_AC_KERNEL_INODE_OWNER_OR_CAPABLE
172 ZFS_AC_KERNEL_INODE_SETATTR
173 ZFS_AC_KERNEL_INODE_GETATTR
174 ZFS_AC_KERNEL_SHOW_OPTIONS
175 ZFS_AC_KERNEL_SHRINKER
177 ZFS_AC_KERNEL_LOOKUP_FLAGS
179 ZFS_AC_KERNEL_PERMISSION
180 ZFS_AC_KERNEL_TMPFILE
181 ZFS_AC_KERNEL_AUTOMOUNT
182 ZFS_AC_KERNEL_COMMIT_METADATA
183 ZFS_AC_KERNEL_SETATTR_PREPARE
184 ZFS_AC_KERNEL_INSERT_INODE_LOCKED
185 ZFS_AC_KERNEL_TRUNCATE_SETSIZE
186 ZFS_AC_KERNEL_SECURITY_INODE
187 ZFS_AC_KERNEL_FST_MOUNT
188 ZFS_AC_KERNEL_SET_NLINK
190 ZFS_AC_KERNEL_VFS_FILEMAP_DIRTY_FOLIO
191 ZFS_AC_KERNEL_VFS_READ_FOLIO
192 ZFS_AC_KERNEL_VFS_RELEASE_FOLIO
193 ZFS_AC_KERNEL_VFS_INVALIDATE_FOLIO
194 ZFS_AC_KERNEL_VFS_FSYNC_2ARGS
195 ZFS_AC_KERNEL_VFS_DIRECT_IO
196 ZFS_AC_KERNEL_VFS_READPAGES
197 ZFS_AC_KERNEL_VFS_SET_PAGE_DIRTY_NOBUFFERS
198 ZFS_AC_KERNEL_VFS_IOV_ITER
199 ZFS_AC_KERNEL_VFS_GENERIC_COPY_FILE_RANGE
200 ZFS_AC_KERNEL_VFS_SPLICE_COPY_FILE_RANGE
201 ZFS_AC_KERNEL_VFS_REMAP_FILE_RANGE
202 ZFS_AC_KERNEL_VFS_CLONE_FILE_RANGE
203 ZFS_AC_KERNEL_VFS_DEDUPE_FILE_RANGE
204 ZFS_AC_KERNEL_KMAP_ATOMIC_ARGS
205 ZFS_AC_KERNEL_KMAP_LOCAL_PAGE
206 ZFS_AC_KERNEL_FOLLOW_DOWN_ONE
207 ZFS_AC_KERNEL_MAKE_REQUEST_FN
208 ZFS_AC_KERNEL_GENERIC_IO_ACCT
210 ZFS_AC_KERNEL_FMODE_T
211 ZFS_AC_KERNEL_KUIDGID_T
212 ZFS_AC_KERNEL_KUID_HELPERS
214 ZFS_AC_KERNEL_TOTALRAM_PAGES_FUNC
215 ZFS_AC_KERNEL_TOTALHIGH_PAGES
217 ZFS_AC_KERNEL_GENERIC_FILLATTR
219 ZFS_AC_KERNEL_SYMLINK
220 ZFS_AC_KERNEL_BIO_MAX_SEGS
221 ZFS_AC_KERNEL_SIGINFO
223 ZFS_AC_KERNEL_STANDALONE_LINUX_STDARG
224 ZFS_AC_KERNEL_STRLCPY
225 ZFS_AC_KERNEL_PAGEMAP_FOLIO_WAIT_BIT
226 ZFS_AC_KERNEL_ADD_DISK
227 ZFS_AC_KERNEL_KTHREAD
228 ZFS_AC_KERNEL_ZERO_PAGE
229 ZFS_AC_KERNEL___COPY_FROM_USER_INATOMIC
230 ZFS_AC_KERNEL_IDMAP_MNT_API
231 ZFS_AC_KERNEL_IDMAP_NO_USERNS
232 ZFS_AC_KERNEL_IATTR_VFSID
233 ZFS_AC_KERNEL_WRITEPAGE_T
234 ZFS_AC_KERNEL_RECLAIMED
235 ZFS_AC_KERNEL_REGISTER_SYSCTL_TABLE
236 ZFS_AC_KERNEL_REGISTER_SYSCTL_SZ
237 ZFS_AC_KERNEL_PROC_HANDLER_CTL_TABLE_CONST
238 ZFS_AC_KERNEL_COPY_SPLICE_READ
239 ZFS_AC_KERNEL_SYNC_BDEV
240 ZFS_AC_KERNEL_MM_PAGE_FLAGS
241 ZFS_AC_KERNEL_MM_PAGE_SIZE
242 ZFS_AC_KERNEL_MM_PAGE_MAPPING
243 ZFS_AC_KERNEL_1ARG_ASSIGN_STR
247 ZFS_AC_KERNEL_CPU_HAS_FEATURE
248 ZFS_AC_KERNEL_FLUSH_DCACHE_PAGE
251 ZFS_AC_KERNEL_FLUSH_DCACHE_PAGE
257 dnl # Detect name used for Module.symvers file in kernel
259 AC_DEFUN([ZFS_AC_MODULE_SYMVERS], [
260 modpost=$LINUX/scripts/Makefile.modpost
261 AC_MSG_CHECKING([kernel file name for module symbols])
262 AS_IF([test "x$enable_linux_builtin" != xyes -a -f "$modpost"], [
263 AS_IF([grep -q Modules.symvers $modpost], [
264 LINUX_SYMBOLS=Modules.symvers
266 LINUX_SYMBOLS=Module.symvers
269 AS_IF([test ! -f "$LINUX_OBJ/$LINUX_SYMBOLS"], [
271 *** Please make sure the kernel devel package for your distribution
272 *** is installed. If you are building with a custom kernel, make sure
273 *** the kernel is configured, built, and the '--with-linux=PATH'
274 *** configure option refers to the location of the kernel source.
280 AC_MSG_RESULT($LINUX_SYMBOLS)
281 AC_SUBST(LINUX_SYMBOLS)
285 dnl # Detect the kernel to be built against
287 dnl # Most modern Linux distributions have separate locations for bare
288 dnl # source (source) and prebuilt (build) files. Additionally, there are
289 dnl # `source` and `build` symlinks in `/lib/modules/$(KERNEL_VERSION)`
290 dnl # pointing to them. The directory search order is now:
292 dnl # - `configure` command line values if both `--with-linux` and
293 dnl # `--with-linux-obj` were defined
295 dnl # - If only `--with-linux` was defined, `--with-linux-obj` is assumed
296 dnl # to have the same value as `--with-linux`
298 dnl # - If neither `--with-linux` nor `--with-linux-obj` were defined
299 dnl # autodetection is used:
301 dnl # - `/lib/modules/$(uname -r)/{source,build}` respectively, if exist.
303 dnl # - If only `/lib/modules/$(uname -r)/build` exists, it is assumed
304 dnl # to be both source and build directory.
306 dnl # - The first directory in `/lib/modules` with the highest version
307 dnl # number according to `sort -V` which contains both `source` and
308 dnl # `build` symlinks/directories. If module directory contains only
309 dnl # `build` component, it is assumed to be both source and build
312 dnl # - Last resort: the first directory matching `/usr/src/kernels/*`
313 dnl # and `/usr/src/linux-*` with the highest version number according
314 dnl # to `sort -V` is assumed to be both source and build directory.
316 AC_DEFUN([ZFS_AC_KERNEL], [
318 AS_HELP_STRING([--with-linux=PATH],
319 [Path to kernel source]),
320 [kernelsrc="$withval"])
322 AC_ARG_WITH(linux-obj,
323 AS_HELP_STRING([--with-linux-obj=PATH],
324 [Path to kernel build objects]),
325 [kernelbuild="$withval"])
327 AC_MSG_CHECKING([kernel source and build directories])
328 AS_IF([test -n "$kernelsrc" && test -z "$kernelbuild"], [
329 kernelbuild="$kernelsrc"
330 ], [test -z "$kernelsrc"], [
331 AS_IF([test -e "/lib/modules/$(uname -r)/source" && \
332 test -e "/lib/modules/$(uname -r)/build"], [
333 src="/lib/modules/$(uname -r)/source"
334 build="/lib/modules/$(uname -r)/build"
335 ], [test -e "/lib/modules/$(uname -r)/build"], [
336 build="/lib/modules/$(uname -r)/build"
341 for d in $(ls -1d /lib/modules/* 2>/dev/null | sort -Vr); do
342 if test -e "$d/source" && test -e "$d/build"; then
348 if test -e "$d/build"; then
355 # the least reliable method
356 if test -z "$src"; then
357 src=$(ls -1d /usr/src/kernels/* /usr/src/linux-* \
358 2>/dev/null | grep -v obj | sort -Vr | head -1)
363 AS_IF([test -n "$src" && test -e "$src"], [
364 kernelsrc=$(readlink -e "$src")
366 kernelsrc="[Not found]"
368 AS_IF([test -n "$build" && test -e "$build"], [
369 kernelbuild=$(readlink -e "$build")
371 kernelbuild="[Not found]"
374 AS_IF([test "$kernelsrc" = "NONE"], [
380 AC_MSG_RESULT([done])
381 AC_MSG_CHECKING([kernel source directory])
382 AC_MSG_RESULT([$kernelsrc])
383 AC_MSG_CHECKING([kernel build directory])
384 AC_MSG_RESULT([$kernelbuild])
385 AS_IF([test ! -d "$kernelsrc" || test ! -d "$kernelbuild"], [
387 *** Please make sure the kernel devel package for your distribution
388 *** is installed and then try again. If that fails, you can specify the
389 *** location of the kernel source and build with the '--with-linux=PATH' and
390 *** '--with-linux-obj=PATH' options respectively.])
393 AC_MSG_CHECKING([kernel source version])
394 utsrelease1=$kernelbuild/include/linux/version.h
395 utsrelease2=$kernelbuild/include/linux/utsrelease.h
396 utsrelease3=$kernelbuild/include/generated/utsrelease.h
397 AS_IF([test -r $utsrelease1 && grep -qF UTS_RELEASE $utsrelease1], [
398 utsrelease=$utsrelease1
399 ], [test -r $utsrelease2 && grep -qF UTS_RELEASE $utsrelease2], [
400 utsrelease=$utsrelease2
401 ], [test -r $utsrelease3 && grep -qF UTS_RELEASE $utsrelease3], [
402 utsrelease=$utsrelease3
405 AS_IF([test -n "$utsrelease"], [
406 kernsrcver=$($AWK '/UTS_RELEASE/ { gsub(/"/, "", $[3]); print $[3] }' $utsrelease)
407 AS_IF([test -z "$kernsrcver"], [
408 AC_MSG_RESULT([Not found])
410 *** Cannot determine kernel version.
414 AC_MSG_RESULT([Not found])
415 if test "x$enable_linux_builtin" != xyes; then
417 *** Cannot find UTS_RELEASE definition.
421 *** Cannot find UTS_RELEASE definition.
422 *** Please run 'make prepare' inside the kernel source tree.])
426 AC_MSG_RESULT([$kernsrcver])
428 AX_COMPARE_VERSION([$kernsrcver], [ge], [$ZFS_META_KVER_MIN], [], [
430 *** Cannot build against kernel version $kernsrcver.
431 *** The minimum supported kernel version is $ZFS_META_KVER_MIN.
435 AC_ARG_ENABLE([linux-experimental],
436 AS_HELP_STRING([--enable-linux-experimental],
437 [Allow building against some unsupported kernel versions]))
439 AX_COMPARE_VERSION([$kernsrcver], [ge], [$ZFS_META_KVER_MAX], [
440 AX_COMPARE_VERSION([$kernsrcver], [eq2], [$ZFS_META_KVER_MAX], [
441 kern_max_version_ok=yes
443 kern_max_version_ok=no
446 kern_max_version_ok=yes
449 AS_IF([test "x$kern_max_version_ok" != "xyes"], [
450 AS_IF([test "x$enable_linux_experimental" == "xyes"], [
451 AC_DEFINE(HAVE_LINUX_EXPERIMENTAL, 1,
452 [building against unsupported kernel version])
455 *** Cannot build against kernel version $kernsrcver.
456 *** The maximum supported kernel version is $ZFS_META_KVER_MAX.
462 LINUX_OBJ=${kernelbuild}
463 LINUX_VERSION=${kernsrcver}
467 AC_SUBST(LINUX_VERSION)
470 AC_DEFUN([ZFS_AC_KERNEL_VERSION_WARNING], [
471 AS_IF([test "x$enable_linux_experimental" = "xyes" && \
472 test "x$kern_max_version_ok" != "xyes"], [
475 You are building OpenZFS against Linux version $kernsrcver.
477 This combination is considered EXPERIMENTAL by the OpenZFS project.
478 Even if it appears to build and run correctly, there may be bugs that
479 can cause SERIOUS DATA LOSS.
481 YOU HAVE BEEN WARNED!
483 If you choose to continue, we'd appreciate if you could report your
484 results on the OpenZFS issue tracker at:
486 https://github.com/openzfs/zfs/issues/new
488 Your feedback will help us prepare a new OpenZFS release that supports
489 this version of Linux.
495 dnl # Detect the QAT module to be built against, QAT provides hardware
496 dnl # acceleration for data compression:
498 dnl # https://01.org/intel-quickassist-technology
500 dnl # 1) Download and install QAT driver from the above link
501 dnl # 2) Start QAT driver in your system:
502 dnl # service qat_service start
503 dnl # 3) Enable QAT in ZFS, e.g.:
504 dnl # ./configure --with-qat=<qat-driver-path>/QAT1.6
506 dnl # 4) Set GZIP compression in ZFS dataset:
507 dnl # zfs set compression = gzip <dataset>
509 dnl # Then the data written to this ZFS pool is compressed by QAT accelerator
510 dnl # automatically, and de-compressed by QAT when read from the pool.
512 dnl # 1) Get QAT hardware statistics with:
513 dnl # cat /proc/icp_dh895xcc_dev/qat
514 dnl # 2) To disable QAT:
515 dnl # insmod zfs.ko zfs_qat_disable=1
517 AC_DEFUN([ZFS_AC_QAT], [
519 AS_HELP_STRING([--with-qat=PATH],
520 [Path to qat source]),
521 AS_IF([test "$withval" = "yes"],
522 AC_MSG_ERROR([--with-qat=PATH requires a PATH]),
523 [qatsrc="$withval"]))
525 AC_ARG_WITH([qat-obj],
526 AS_HELP_STRING([--with-qat-obj=PATH],
527 [Path to qat build objects]),
528 [qatbuild="$withval"])
530 AS_IF([test ! -z "${qatsrc}"], [
531 AC_MSG_CHECKING([qat source directory])
532 AC_MSG_RESULT([$qatsrc])
533 QAT_SRC="${qatsrc}/quickassist"
534 AS_IF([ test ! -e "$QAT_SRC/include/cpa.h"], [
536 *** Please make sure the qat driver package is installed
537 *** and specify the location of the qat source with the
538 *** '--with-qat=PATH' option then try again. Failed to
544 AS_IF([test ! -z "${qatsrc}"], [
545 AC_MSG_CHECKING([qat build directory])
546 AS_IF([test -z "$qatbuild"], [
547 qatbuild="${qatsrc}/build"
550 AC_MSG_RESULT([$qatbuild])
552 AS_IF([ ! test -e "$QAT_OBJ/icp_qa_al.ko" && ! test -e "$QAT_OBJ/qat_api.ko"], [
554 *** Please make sure the qat driver is installed then try again.
555 *** Failed to find icp_qa_al.ko or qat_api.ko in:
562 AC_DEFINE(HAVE_QAT, 1,
563 [qat is enabled and existed])
567 dnl # Detect the name used for the QAT Module.symvers file.
569 AS_IF([test ! -z "${qatsrc}"], [
570 AC_MSG_CHECKING([qat file for module symbols])
571 QAT_SYMBOLS=$QAT_SRC/lookaside/access_layer/src/Module.symvers
573 AS_IF([test -r $QAT_SYMBOLS], [
574 AC_MSG_RESULT([$QAT_SYMBOLS])
575 AC_SUBST(QAT_SYMBOLS)
578 *** Please make sure the qat driver is installed then try again.
579 *** Failed to find Module.symvers in:
587 dnl # ZFS_LINUX_CONFTEST_H
589 AC_DEFUN([ZFS_LINUX_CONFTEST_H], [
590 test -d build/$2 || mkdir -p build/$2
591 cat - <<_ACEOF >build/$2/$2.h
597 dnl # ZFS_LINUX_CONFTEST_C
599 AC_DEFUN([ZFS_LINUX_CONFTEST_C], [
600 test -d build/$2 || mkdir -p build/$2
601 cat confdefs.h - <<_ACEOF >build/$2/$2.c
607 dnl # ZFS_LINUX_CONFTEST_MAKEFILE
609 dnl # $1 - test case name
610 dnl # $2 - add to top-level Makefile
611 dnl # $3 - additional build flags
613 AC_DEFUN([ZFS_LINUX_CONFTEST_MAKEFILE], [
614 test -d build || mkdir -p build
615 test -d build/$1 || mkdir -p build/$1
617 file=build/$1/Makefile
619 dnl # Example command line to manually build source.
620 cat - <<_ACEOF >$file
621 # Example command line to manually build source
622 # make modules -C $LINUX_OBJ $ARCH_UM M=$PWD/build/$1
624 ccflags-y := -Werror $FRAME_LARGER_THAN
627 dnl # Additional custom CFLAGS as requested.
628 m4_ifval($3, [echo "ccflags-y += $3" >>$file], [])
630 dnl # Test case source
631 echo "obj-m := $1.o" >>$file
633 AS_IF([test "x$2" = "xyes"], [echo "obj-m += $1/" >>build/Makefile], [])
637 dnl # ZFS_LINUX_TEST_PROGRAM(C)([PROLOGUE], [BODY])
639 m4_define([ZFS_LINUX_TEST_PROGRAM], [
640 #include <linux/module.h>
651 MODULE_DESCRIPTION("conftest");
652 MODULE_AUTHOR(ZFS_META_AUTHOR);
653 MODULE_VERSION(ZFS_META_VERSION "-" ZFS_META_RELEASE);
658 dnl # ZFS_LINUX_TEST_REMOVE
660 dnl # Removes the specified test source and results.
662 AC_DEFUN([ZFS_LINUX_TEST_REMOVE], [
663 test -d build/$1 && rm -Rf build/$1
664 test -f build/Makefile && sed '/$1/d' build/Makefile
668 dnl # ZFS_LINUX_COMPILE
671 dnl # $2 - test command
672 dnl # $3 - pass command
673 dnl # $4 - fail command
674 dnl # $5 - set KBUILD_MODPOST_NOFINAL='yes'
675 dnl # $6 - set KBUILD_MODPOST_WARN='yes'
677 dnl # Used internally by ZFS_LINUX_TEST_{COMPILE,MODPOST}
679 AC_DEFUN([ZFS_LINUX_COMPILE], [
680 AC_ARG_VAR([KERNEL_CC], [C compiler for
681 building kernel modules])
682 AC_ARG_VAR([KERNEL_LD], [Linker for
683 building kernel modules])
684 AC_ARG_VAR([KERNEL_LLVM], [Binary option to
685 build kernel modules with LLVM/CLANG toolchain])
687 KBUILD_MODPOST_NOFINAL="$5" KBUILD_MODPOST_WARN="$6"
688 make modules -k -j$TEST_JOBS ${KERNEL_CC:+CC=$KERNEL_CC}
689 ${KERNEL_LD:+LD=$KERNEL_LD} ${KERNEL_LLVM:+LLVM=$KERNEL_LLVM}
690 CONFIG_MODULES=y CFLAGS_MODULE=-DCONFIG_MODULES
691 -C $LINUX_OBJ $ARCH_UM M=$PWD/$1 >$1/build.log 2>&1])
692 AS_IF([AC_TRY_COMMAND([$2])], [$3], [$4])
696 dnl # ZFS_LINUX_TEST_COMPILE
698 dnl # Perform a full compile excluding the final modpost phase.
700 AC_DEFUN([ZFS_LINUX_TEST_COMPILE], [
701 ZFS_LINUX_COMPILE([$2], [test -f $2/build.log], [
702 mv $2/Makefile $2/Makefile.compile.$1
703 mv $2/build.log $2/build.log.$1
706 *** Unable to compile test source to determine kernel interfaces.])
711 dnl # ZFS_LINUX_TEST_MODPOST
713 dnl # Perform a full compile including the modpost phase. This may
714 dnl # be an incremental build if the objects have already been built.
716 AC_DEFUN([ZFS_LINUX_TEST_MODPOST], [
717 ZFS_LINUX_COMPILE([$2], [test -f $2/build.log], [
718 mv $2/Makefile $2/Makefile.modpost.$1
719 cat $2/build.log >>build/build.log.$1
722 *** Unable to modpost test source to determine kernel interfaces.])
727 dnl # Perform the compilation of the test cases in two phases.
729 dnl # Phase 1) attempt to build the object files for all of the tests
730 dnl # defined by the ZFS_LINUX_TEST_SRC macro. But do not
731 dnl # perform the final modpost stage.
733 dnl # Phase 2) disable all tests which failed the initial compilation,
734 dnl # then invoke the final modpost step for the remaining tests.
736 dnl # This allows us efficiently build the test cases in parallel while
737 dnl # remaining resilient to build failures which are expected when
738 dnl # detecting the available kernel interfaces.
740 dnl # The maximum allowed parallelism can be controlled by setting the
741 dnl # TEST_JOBS environment variable. Otherwise, it default to $(nproc).
743 AC_DEFUN([ZFS_LINUX_TEST_COMPILE_ALL], [
744 dnl # Phase 1 - Compilation only, final linking is skipped.
745 ZFS_LINUX_TEST_COMPILE([$1], [build])
748 dnl # Phase 2 - When building external modules disable test cases
749 dnl # which failed to compile and invoke modpost to verify the
752 dnl # Test names suffixed with '_license' call modpost independently
753 dnl # to ensure that a single incompatibility does not result in the
754 dnl # modpost phase exiting early. This check is not performed on
755 dnl # every symbol since the majority are compatible and doing so
756 dnl # would significantly slow down this phase.
758 dnl # When configuring for builtin (--enable-linux-builtin)
759 dnl # fake the linking step artificially create the expected .ko
760 dnl # files for tests which did compile. This is required for
761 dnl # kernels which do not have loadable module support or have
762 dnl # not yet been built.
764 AS_IF([test "x$enable_linux_builtin" = "xno"], [
765 for dir in $(awk '/^obj-m/ { print [$]3 }' \
766 build/Makefile.compile.$1); do
768 AS_IF([test -f build/$name/$name.o], [
769 AS_IF([test "${name##*_}" = "license"], [
770 ZFS_LINUX_TEST_MODPOST([$1],
772 echo "obj-n += $dir" >>build/Makefile
774 echo "obj-m += $dir" >>build/Makefile
777 echo "obj-n += $dir" >>build/Makefile
781 ZFS_LINUX_TEST_MODPOST([$1], [build])
783 for dir in $(awk '/^obj-m/ { print [$]3 }' \
784 build/Makefile.compile.$1); do
786 AS_IF([test -f build/$name/$name.o], [
787 touch build/$name/$name.ko
794 dnl # ZFS_LINUX_TEST_SRC
799 dnl # $4 - extra cflags
800 dnl # $5 - check license-compatibility
802 dnl # Check if the test source is buildable at all and then if it is
803 dnl # license compatible.
805 dnl # N.B because all of the test cases are compiled in parallel they
806 dnl # must never depend on the results of previous tests. Each test
807 dnl # needs to be entirely independent.
809 AC_DEFUN([ZFS_LINUX_TEST_SRC], [
810 ZFS_LINUX_CONFTEST_C([ZFS_LINUX_TEST_PROGRAM([[$2]], [[$3]],
811 [["Dual BSD/GPL"]])], [$1])
812 ZFS_LINUX_CONFTEST_MAKEFILE([$1], [yes], [$4])
814 AS_IF([ test -n "$5" ], [
815 ZFS_LINUX_CONFTEST_C([ZFS_LINUX_TEST_PROGRAM(
816 [[$2]], [[$3]], [[$5]])], [$1_license])
817 ZFS_LINUX_CONFTEST_MAKEFILE([$1_license], [yes], [$4])
822 dnl # ZFS_LINUX_TEST_RESULT
824 dnl # $1 - name of a test source (ZFS_LINUX_TEST_SRC)
825 dnl # $2 - run on success (valid .ko generated)
826 dnl # $3 - run on failure (unable to compile)
828 AC_DEFUN([ZFS_LINUX_TEST_RESULT], [
829 AS_IF([test -d build/$1], [
830 AS_IF([test -f build/$1/$1.ko], [$2], [$3])
833 *** No matching source for the "$1" test, check that
834 *** both the test source and result macros refer to the same name.
840 dnl # ZFS_LINUX_TEST_ERROR
842 dnl # Generic error message which can be used when none of the expected
843 dnl # kernel interfaces were detected.
845 AC_DEFUN([ZFS_LINUX_TEST_ERROR], [
847 *** None of the expected "$1" interfaces were detected.
848 *** This may be because your kernel version is newer than what is
849 *** supported, or you are using a patched custom kernel with
850 *** incompatible modifications.
852 *** ZFS Version: $ZFS_META_ALIAS
853 *** Compatible Kernels: $ZFS_META_KVER_MIN - $ZFS_META_KVER_MAX
858 dnl # ZFS_LINUX_TEST_RESULT_SYMBOL
860 dnl # Like ZFS_LINUX_TEST_RESULT except ZFS_CHECK_SYMBOL_EXPORT is called to
861 dnl # verify symbol exports, unless --enable-linux-builtin was provided to
864 AC_DEFUN([ZFS_LINUX_TEST_RESULT_SYMBOL], [
865 AS_IF([ ! test -f build/$1/$1.ko], [
868 AS_IF([test "x$enable_linux_builtin" != "xyes"], [
869 ZFS_CHECK_SYMBOL_EXPORT([$2], [$3], [$4], [$5])
877 dnl # ZFS_LINUX_COMPILE_IFELSE
879 AC_DEFUN([ZFS_LINUX_COMPILE_IFELSE], [
880 ZFS_LINUX_TEST_REMOVE([conftest])
882 m4_ifvaln([$1], [ZFS_LINUX_CONFTEST_C([$1], [conftest])])
883 m4_ifvaln([$5], [ZFS_LINUX_CONFTEST_H([$5], [conftest])],
884 [ZFS_LINUX_CONFTEST_H([], [conftest])])
886 ZFS_LINUX_CONFTEST_MAKEFILE([conftest], [no],
887 [m4_ifvaln([$5], [-I$PWD/build/conftest], [])])
888 ZFS_LINUX_COMPILE([build/conftest], [$2], [$3], [$4], [], [])
892 dnl # ZFS_LINUX_TRY_COMPILE
896 dnl # $3 - run on success (valid .ko generated)
897 dnl # $4 - run on failure (unable to compile)
899 dnl # When configuring as builtin (--enable-linux-builtin) for kernels
900 dnl # without loadable module support (CONFIG_MODULES=n) only the object
901 dnl # file is created. See ZFS_LINUX_TEST_COMPILE_ALL for details.
903 AC_DEFUN([ZFS_LINUX_TRY_COMPILE], [
904 AS_IF([test "x$enable_linux_builtin" = "xyes"], [
905 ZFS_LINUX_COMPILE_IFELSE(
906 [ZFS_LINUX_TEST_PROGRAM([[$1]], [[$2]],
907 [[ZFS_META_LICENSE]])],
908 [test -f build/conftest/conftest.o], [$3], [$4])
910 ZFS_LINUX_COMPILE_IFELSE(
911 [ZFS_LINUX_TEST_PROGRAM([[$1]], [[$2]],
912 [[ZFS_META_LICENSE]])],
913 [test -f build/conftest/conftest.ko], [$3], [$4])
918 dnl # ZFS_CHECK_SYMBOL_EXPORT
920 dnl # Check if a symbol is exported on not by consulting the symbols
921 dnl # file, or optionally the source code.
923 AC_DEFUN([ZFS_CHECK_SYMBOL_EXPORT], [
924 grep -q -E '[[[:space:]]]$1[[[:space:]]]' \
925 $LINUX_OBJ/$LINUX_SYMBOLS 2>/dev/null
927 if test $rc -ne 0; then
930 grep -q -E "EXPORT_SYMBOL.*($1)" \
931 "$LINUX/$file" 2>/dev/null
933 if test $rc -eq 0; then
938 if test $export -eq 0; then :
949 dnl # ZFS_LINUX_TRY_COMPILE_SYMBOL
951 dnl # Like ZFS_LINUX_TRY_COMPILER except ZFS_CHECK_SYMBOL_EXPORT is called
952 dnl # to verify symbol exports, unless --enable-linux-builtin was provided
955 AC_DEFUN([ZFS_LINUX_TRY_COMPILE_SYMBOL], [
956 ZFS_LINUX_TRY_COMPILE([$1], [$2], [rc=0], [rc=1])
957 if test $rc -ne 0; then :
960 if test "x$enable_linux_builtin" != xyes; then
961 ZFS_CHECK_SYMBOL_EXPORT([$3], [$4], [rc=0], [rc=1])
963 if test $rc -ne 0; then :
972 dnl # ZFS_LINUX_TRY_COMPILE_HEADER
973 dnl # like ZFS_LINUX_TRY_COMPILE, except the contents conftest.h are
974 dnl # provided via the fifth parameter
976 AC_DEFUN([ZFS_LINUX_TRY_COMPILE_HEADER], [
977 AS_IF([test "x$enable_linux_builtin" = "xyes"], [
978 ZFS_LINUX_COMPILE_IFELSE(
979 [ZFS_LINUX_TEST_PROGRAM([[$1]], [[$2]],
980 [[ZFS_META_LICENSE]])],
981 [test -f build/conftest/conftest.o], [$3], [$4], [$5])
983 ZFS_LINUX_COMPILE_IFELSE(
984 [ZFS_LINUX_TEST_PROGRAM([[$1]], [[$2]],
985 [[ZFS_META_LICENSE]])],
986 [test -f build/conftest/conftest.ko], [$3], [$4], [$5])
991 dnl # AS_VERSION_COMPARE_LE
992 dnl # like AS_VERSION_COMPARE_LE, but runs $3 if (and only if) $1 <= $2
993 dnl # AS_VERSION_COMPARE_LE (version-1, version-2, [action-if-less-or-equal], [action-if-greater])
995 AC_DEFUN([AS_VERSION_COMPARE_LE], [
996 AS_VERSION_COMPARE([$1], [$2], [$3], [$3], [$4])
1000 dnl # ZFS_LINUX_REQUIRE_API
1001 dnl # like ZFS_LINUX_TEST_ERROR, except only fails if the kernel is
1002 dnl # at least some specified version.
1004 AC_DEFUN([ZFS_LINUX_REQUIRE_API], [
1005 AS_VERSION_COMPARE_LE([$2], [$kernsrcver], [
1007 *** None of the expected "$1" interfaces were detected. This
1008 *** interface is expected for kernels version "$2" and above.
1009 *** This may be because your kernel version is newer than what is
1010 *** supported, or you are using a patched custom kernel with
1011 *** incompatible modifications. Newer kernels may have incompatible
1014 *** ZFS Version: $ZFS_META_ALIAS
1015 *** Compatible Kernels: $ZFS_META_KVER_MIN - $ZFS_META_KVER_MAX