+]) # LIBCFS_KTIME_TO_TIMESPEC64
+
+#
+# Kernel version 3.19 introduced ktime_get_seconds
+#
+AC_DEFUN([LIBCFS_KTIME_GET_SECONDS],[
+LB_CHECK_COMPILE([does function 'ktime_get_seconds' exist],
+ktime_get_seconds, [
+ #include <linux/ktime.h>
+],[
+ time64_t now;
+
+ now = ktime_get_seconds();
+],[
+ AC_DEFINE(HAVE_KTIME_GET_SECONDS, 1,
+ ['ktime_get_seconds' is available])
+])
+]) # LIBCFS_KTIME_GET_SECONDS
+
+#
+# Kernel version 4.2 changed topology_thread_cpumask
+# to topology_sibling_cpumask
+#
+AC_DEFUN([LIBCFS_HAVE_TOPOLOGY_SIBLING_CPUMASK],[
+LB_CHECK_COMPILE([does function 'topology_sibling_cpumask' exist],
+topology_sibling_cpumask, [
+ #include <linux/topology.h>
+],[
+ const struct cpumask *mask;
+
+ mask = topology_sibling_cpumask(0);
+],[
+ AC_DEFINE(HAVE_TOPOLOGY_SIBLING_CPUMASK, 1,
+ [topology_sibling_cpumask is available])
+])
+]) # LIBCFS_HAVE_TOPOLOGY_SIBLING_CPUMASK
+
+#
+# Kernel version 4.2 commit df6b35f409af0a8ff1ef62f552b8402f3fef8665
+# header file i387.h was renamed to fpu/api.h
+#
+AC_DEFUN([LIBCFS_FPU_API], [
+LB_CHECK_LINUX_HEADER([asm/fpu/api.h], [
+ AC_DEFINE(HAVE_FPU_API_HEADER, 1,
+ [fpu/api.h is present])])
+]) # LIBCFS_FPU_API
+
+#
+# Kernel version 4.5-rc1 commit d12481bc58fba89427565f8592e88446ec084a24
+# added crypto hash helpers
+#
+AC_DEFUN([LIBCFS_CRYPTO_HASH_HELPERS], [
+LB_CHECK_COMPILE([does crypto hash helper functions exist],
+crypto_hash_helpers, [
+ #include <crypto/hash.h>
+],[
+ crypto_ahash_alg_name(NULL);
+ crypto_ahash_driver_name(NULL);
+],[
+ AC_DEFINE(HAVE_CRYPTO_HASH_HELPERS, 1,
+ [crypto hash helper functions are available])
+])
+]) # LIBCFS_CRYPTO_HASH_HELPERS
+
+#
+# LIBCFS_STACKTRACE_OPS_ADDRESS_RETURN_INT
+#
+# linux 4.6 kernel changed stacktrace_ops address to return an int
+#
+AC_DEFUN([LIBCFS_STACKTRACE_OPS_ADDRESS_RETURN_INT], [
+LB_CHECK_COMPILE([if 'struct stacktrace_ops' address function returns an int],
+stacktrace_ops_address_return_int, [
+ #include <asm/stacktrace.h>
+],[
+ int rc;
+
+ rc = ((struct stacktrace_ops *)0)->address(NULL, 0, 0);
+],[
+ AC_DEFINE(STACKTRACE_OPS_ADDRESS_RETURN_INT, 1,
+ ['struct stacktrace_ops' address function returns an int])
+])
+]) # LIBCFS_STACKTRACE_OPS_ADDRESS_RETURN_INT
+
+#
+# Kernel version 4.6 removed both struct task_struct and struct mm_struct
+# arguments to get_user_pages
+#
+AC_DEFUN([LIBCFS_GET_USER_PAGES_6ARG], [
+LB_CHECK_COMPILE([if 'get_user_pages()' takes 6 arguments],
+get_user_pages_6arg, [
+ #include <linux/mm.h>
+],[
+ int rc;
+
+ rc = get_user_pages(0, 0, 0, 0, NULL, NULL);
+],[
+ AC_DEFINE(HAVE_GET_USER_PAGES_6ARG, 1,
+ [get_user_pages takes 6 arguments])
+])
+]) # LIBCFS_GET_USER_PAGES_6ARG
+
+#
+# LIBCFS_STACKTRACE_OPS
+#
+# Kernel version 4.8 commit c8fe4609827aedc9c4b45de80e7cdc8ccfa8541b
+# removed both struct stacktrace_ops and dump_trace() function
+#
+AC_DEFUN([LIBCFS_STACKTRACE_OPS], [
+LB_CHECK_COMPILE([if 'struct stacktrace_ops' exists],
+stacktrace_ops, [
+ struct task_struct;
+ struct pt_regs;
+ #include <asm/stacktrace.h>
+],[
+ struct stacktrace_ops ops;
+ ops.stack = NULL;
+],[
+ AC_DEFINE(HAVE_STACKTRACE_OPS, 1,
+ [struct stacktrace_ops exists])
+])
+]) # LIBCFS_STACKTRACE_OPS
+
+#
+# Kernel version 4.9 commit 768ae309a96103ed02eb1e111e838c87854d8b51
+# mm: replace get_user_pages() write/force parameters with gup_flags
+#
+AC_DEFUN([LIBCFS_GET_USER_PAGES_GUP_FLAGS], [
+LB_CHECK_COMPILE([if 'get_user_pages()' takes gup_flags in arguments],
+get_user_pages_gup_flags, [
+ #include <linux/mm.h>
+],[
+ int rc;
+ rc = get_user_pages(0, 0, FOLL_WRITE, NULL, NULL);
+],[
+ AC_DEFINE(HAVE_GET_USER_PAGES_GUP_FLAGS, 1,
+ [get_user_pages takes gup_flags in arguments])
+])
+]) # LIBCFS_GET_USER_PAGES_GUP_FLAGS