AC_SUBST(KMODEXT)
makerule="$PWD/build"
-AC_CACHE_CHECK([for external module build target], lb_cv_module_target, [
-lb_cv_module_target=""
-MODULE_TARGET="SUBDIRS"
-rm -f build/conftest.i
-LB_LINUX_TRY_MAKE([], [],
- [$makerule LUSTRE_KERNEL_TEST=conftest.i],
- [test -s build/conftest.i],
- [lb_cv_module_target="SUBDIRS"], [
- MODULE_TARGET="M"
- makerule="_module_$PWD/build"
- LB_LINUX_TRY_MAKE([], [],
- [$makerule LUSTRE_KERNEL_TEST=conftest.i],
- [test -s build/conftest.i],
- [lb_cv_module_target="M"], [
- AC_MSG_ERROR([unknown; check config.log for details])
- ])
- ])
+AC_CACHE_CHECK([for external module build target], lb_cv_module_target,
+[
+ lb_cv_module_target=""
+ MODULE_TARGET="SUBDIRS"
+ rm -f build/conftest.i
+ LB_LINUX_TRY_MAKE([], [],
+ [$makerule LUSTRE_KERNEL_TEST=conftest.i],
+ [test -s build/conftest.i],
+ [lb_cv_module_target="SUBDIRS"],[
+ MODULE_TARGET="M"
+ makerule="$PWD/build/"
+ LB_LINUX_TRY_MAKE([], [],
+ [$makerule LUSTRE_KERNEL_TEST=conftest.i],
+ [test -s build/conftest.i],
+ [lb_cv_module_target="M54"], [
+ MODULE_TARGET="M"
+ makerule="_module_$PWD/build"
+ LB_LINUX_TRY_MAKE([], [],
+ [$makerule LUSTRE_KERNEL_TEST=conftest.i],
+ [test -s build/conftest.i],
+ [lb_cv_module_target="M"], [
+ AC_MSG_ERROR([kernel module make failed; check config.log for details])
+ ])])])
])
AS_IF([test -z "$lb_cv_module_target"],
[AC_MSG_ERROR([unknown external module build target])],
+[test "x$lb_cv_module_target" = "xM54"],
+ [makerule="$PWD/build"
+ lb_cv_module_target="M"],
[test "x$lb_cv_module_target" = "xM"],
[makerule="_module_$PWD/build"])
MODULE_TARGET=$lb_cv_module_target
])
])
AS_IF([test "x$lb_cv_mainline_kernel_sig" = "xyes"], [
- MAINLINE_KERNEL="yes"
+ RHEL_KERNEL="yes"
KERNEL_FOUND="yes"
])
])
[KMP_MODDIR=$withval
IN_KERNEL=''],[
AS_IF([test x$RHEL_KERNEL = xyes], [KMP_MODDIR="extra/kernel"],
- [test x$MAINLINE_KERNEL = xyes], [KMP_MODDIR="extra/kernel"],
[test x$SUSE_KERNEL = xyes], [KMP_MODDIR="updates/kernel"],
[test x$UBUNTU_KERNEL = xyes], [KMP_MODDIR="updates/kernel"],
[test x$DEBIAN_KERNEL = xyes], [KMP_MODDIR="updates/kernel"],
# Find paths for linux, handling kernel-source rpms
#
AC_DEFUN([LB_LINUX_PATH], [
-for DEFAULT_LINUX in /usr/src/linux-source-* /lib/modules/$(uname -r)/{source,build} /usr/src/linux $(find /usr/src/kernels/ -maxdepth 1 -name @<:@0-9@:>@\* | xargs -r ls -d | tail -n 1); do
+for DEFAULT_LINUX in /usr/src/linux-source-* /lib/modules/$(uname -r)/{source,build} /usr/src/linux* $(find /usr/src/kernels/ -maxdepth 1 -name @<:@0-9@:>@\* | xargs -r ls -d | tail -n 1); do
AS_IF([readlink -q -e $DEFAULT_LINUX >/dev/null], [break])
done
if test "$DEFAULT_LINUX" = "/lib/modules/$(uname -r)/source"; then
[
#include <linux/kernel.h>
#include <linux/module.h>
+
+#if defined(NEED_LOCKDEP_IS_HELD_DISCARD_CONST) \
+ && defined(CONFIG_LOCKDEP) \
+ && defined(lockdep_is_held)
+#undef lockdep_is_held
+ #define lockdep_is_held(lock) \
+ lock_is_held((struct lockdep_map *)&(lock)->dep_map)
+#endif
+
$1
int
main (void)
AS_VAR_IF([lb_header], [yes], [$2], [$3])[]dnl
AS_VAR_POPDEF([lb_header])dnl
]) # LB_CHECK_LINUX_HEADER
+
+# ------------------------------------------------------------------------------
+# Support 2 stage: parallel compile then checked test results
+# Heavily inspired by OpenZFS
+
+AC_DEFUN([LB2_LINUX_CONFTEST_C], [
+test -d ${TEST_DIR}/$2 || mkdir -p ${TEST_DIR}/$2
+cat confdefs.h - <<_EOF >${TEST_DIR}/$2/$2.c
+$1
+_EOF
+])
+
+#
+# LB2_LINUX_CONFTEST_MAKEFILE
+#
+# $1 - *unique* test case name
+# $2 - additional build flags (ccflags)
+# $3 - external kernel includes for lnet o2ib|gni
+#
+AC_DEFUN([LB2_LINUX_CONFTEST_MAKEFILE], [
+ test -d ${TEST_DIR} || mkdir -p ${TEST_DIR}
+ test -d ${TEST_DIR}/$1 || mkdir -p ${TEST_DIR}/$1
+
+ file=${TEST_DIR}/$1/Makefile
+ EXT_INCLUDE="$3"
+
+ cat - <<_EOF >$file
+# Example command line to manually build source
+# make modules -C $LINUX_OBJ $ARCH_UM M=${TEST_DIR}/$1
+
+${LD:+LD="$LD"}
+CC=$CC
+ZINC=${ZFS}
+SINC=${SPL}
+ZOBJ=${ZFS_OBJ}
+SOBJ=${SPL_OBJ}
+
+LINUXINCLUDE = $EXT_INCLUDE
+LINUXINCLUDE += -I$LINUX/arch/$SUBARCH/include
+LINUXINCLUDE += -Iinclude -Iarch/$SUBARCH/include/generated
+LINUXINCLUDE += -I$LINUX/include
+LINUXINCLUDE += -Iinclude2
+LINUXINCLUDE += -I$LINUX/include/uapi
+LINUXINCLUDE += -Iinclude/generated
+LINUXINCLUDE += -I$LINUX/arch/$SUBARCH/include/uapi
+LINUXINCLUDE += -Iarch/$SUBARCH/include/generated/uapi
+LINUXINCLUDE += -I$LINUX/include/uapi -Iinclude/generated/uapi
+ifneq (\$(SOBJ),)
+LINUXINCLUDE += -include \$(SOBJ)/spl_config.h
+endif
+ifneq (\$(ZOBJ),)
+LINUXINCLUDE += -include \$(ZOBJ)/zfs_config.h
+endif
+ifneq (\$(SINC),)
+LINUXINCLUDE += -I\$(SINC)/include
+endif
+ifneq (\$(ZINC),)
+LINUXINCLUDE += -I\$(ZINC) -I\$(ZINC)/include
+ifneq (\$(SINC),)
+LINUXINCLUDE += -I\$(SINC)
+else
+LINUXINCLUDE += -I\$(ZINC)/include/spl
+endif
+endif
+LINUXINCLUDE += -include $CONFIG_INCLUDE
+KBUILD_EXTRA_SYMBOLS=${ZFS_OBJ:+$ZFS_OBJ/Module.symvers}
+
+ccflags-y := -Werror-implicit-function-declaration
+_EOF
+
+ # Additional custom CFLAGS as requested.
+ m4_ifval($2, [echo "ccflags-y += $2" >>$file], [])
+
+ # Test case source
+ echo "obj-m := $1.o" >>$file
+ echo "obj-m += $1/" >>${TEST_DIR}/Makefile
+])
+
+
+#
+# LB2_LINUX_COMPILE
+#
+# $1 - build dir
+# $2 - test command
+# $3 - pass command
+# $4 - fail command
+#
+# Used internally by LB2_LINUX_TEST_COMPILE
+#
+AC_DEFUN([LB2_LINUX_COMPILE], [
+ AC_TRY_COMMAND([
+ KBUILD_MODPOST_NOFINAL="yes"
+ make modules -k -j$TEST_JOBS -C $LINUX_OBJ $ARCH_UM
+ M=$1 >$1/build.log 2>&1])
+ AS_IF([AC_TRY_COMMAND([$2])], [$3], [$4])
+])
+
+#
+# LB2_LINUX_TEST_COMPILE
+#
+# Perform a full compile excluding the final modpost phase.
+# $1 - flavor
+# $2 - dirname
+#
+AC_DEFUN([LB2_LINUX_TEST_COMPILE], [
+ LB2_LINUX_COMPILE([$2], [test -f $2/build.log], [
+ mv $2/Makefile $2/Makefile.compile.$1
+ mv $2/build.log $2/build.log.$1
+ ],[
+ AC_MSG_ERROR([
+ *** Unable to compile test source to determine kernel interfaces.])
+ ])
+])
+
+#
+# Perform the compilation of the test cases in two phases.
+#
+# Phase 1) attempt to build the object files for all of the tests
+# defined by the LB2_LINUX_TEST_SRC macro.
+#
+# Phase 2) disable all tests which failed the initial compilation.
+#
+# This allows us efficiently build the test cases in parallel while
+# remaining resilient to build failures which are expected when
+# detecting the available kernel interfaces.
+#
+# The maximum allowed parallelism can be controlled by setting the
+# TEST_JOBS environment variable which defaults to $(nproc).
+#
+AC_DEFUN([LB2_LINUX_TEST_COMPILE_ALL], [
+ # Phase 1 - Compilation only, final linking is skipped.
+ LB2_LINUX_TEST_COMPILE([$1], [${TEST_DIR}])
+
+ for dir in $(awk '/^obj-m/ { print [$]3 }' \
+ ${TEST_DIR}/Makefile.compile.$1); do
+ name=${dir%/}
+ AS_IF([test -f ${TEST_DIR}/$name/$name.o], [
+ touch ${TEST_DIR}/$name/$name.ko
+ ])
+ done
+])
+
+#
+# LB2_LINUX_TEST_SRC
+#
+# $1 - *unique* name
+# $2 - global
+# $3 - source
+# $4 - extra cflags
+# $5 - external include paths
+#
+# NOTICE as all of the test cases are compiled in parallel tests may not
+# depend on the results other tests.
+# Each test needs resolve any external dependencies at the time the program
+# source is generated.
+#
+AC_DEFUN([LB2_LINUX_TEST_SRC], [
+ LB2_LINUX_CONFTEST_C([LB_LANG_PROGRAM([[$2]], [[$3]])], [$1_pc])
+ LB2_LINUX_CONFTEST_MAKEFILE([$1_pc], [$4], [$5])
+])
+
+#
+# LB2_LINUX_TEST_RESULT
+#
+# $1 - *unique* name matching the LB2_LINUX_TEST_SRC macro
+# $2 - run on success (valid .ko generated)
+# $3 - run on failure (unable to compile)
+#
+AC_DEFUN([LB2_LINUX_TEST_RESULT], [
+ AS_IF([test -d ${TEST_DIR}/$1_pc], [
+ AS_IF([test -f ${TEST_DIR}/$1_pc/$1_pc.ko], [$2], [$3])
+ ], [
+ AC_MSG_ERROR([
+ *** No matching source for the "$1" test, check that
+ *** both the test source and result macros refer to the same name.
+ ])
+ ])
+])
+