+# Kernel version 3.17 created ktime_get_real_ns wrapper
+#
+AC_DEFUN([LIBCFS_KTIME_GET_REAL_NS],[
+LB_CHECK_COMPILE([does function 'ktime_get_real_ns' exist],
+ktime_get_real_ns, [
+ #include <linux/hrtimer.h>
+ #include <linux/ktime.h>
+],[
+ u64 nanoseconds;
+
+ nanoseconds = ktime_get_real_ns();
+],[],[
+ AC_DEFINE(NEED_KTIME_GET_REAL_NS, 1,
+ ['ktime_get_real_ns' is not available])
+])
+]) # LIBCFS_KTIME_GET_REAL_NS
+
+#
+# Kernel version 3.17 introduced ktime_to_timespec64
+#
+AC_DEFUN([LIBCFS_KTIME_TO_TIMESPEC64],[
+LB_CHECK_COMPILE([does function 'ktime_to_timespec64' exist],
+ktime_to_timespec64, [
+ #include <linux/hrtimer.h>
+ #include <linux/ktime.h>
+],[
+ ktime_t now = ktime_set(0, 0);
+ struct timespec64 ts;
+
+ ts = ktime_to_timespec64(now);
+],[
+ AC_DEFINE(HAVE_KTIME_TO_TIMESPEC64, 1,
+ ['ktime_to_timespec64' is available])
+])
+]) # LIBCFS_KTIME_TO_TIMESPEC64
+
+#
+# Kernel version 3.17 introduced timespec64_sub
+#
+AC_DEFUN([LIBCFS_TIMESPEC64_SUB],[
+LB_CHECK_COMPILE([does function 'timespec64_sub' exist],
+timespec64_sub, [
+ #include <linux/time.h>
+],[
+ struct timespec64 later = { }, earlier = { }, diff;
+
+ diff = timespec64_sub(later, earlier);
+],[
+ AC_DEFINE(HAVE_TIMESPEC64_SUB, 1,
+ ['timespec64_sub' is available])
+])
+]) # LIBCFS_TIMESPEC64_SUB
+
+#
+# Kernel version 3.17 introduced timespec64_to_ktime
+#
+AC_DEFUN([LIBCFS_TIMESPEC64_TO_KTIME],[
+LB_CHECK_COMPILE([does function 'timespec64_to_ktime' exist],
+timespec64_to_ktime, [
+ #include <linux/ktime.h>
+],[
+ struct timespec64 ts;
+ ktime_t now;
+
+ now = timespec64_to_ktime(ts);
+],[
+ AC_DEFINE(HAVE_TIMESPEC64_TO_KTIME, 1,
+ ['timespec64_to_ktime' is available])
+])
+]) # LIBCFS_TIMESPEC64_TO_KTIME
+
+#
+# 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.0 commit 41fbf3b39d5eca01527338b4d0ee15ee1ae1023c
+# introduced the helper function ktime_ms_delta.
+#
+AC_DEFUN([LIBCFS_KTIME_MS_DELTA],[
+LB_CHECK_COMPILE([does function 'ktime_ms_delta' exist],
+ktime_ms_delta, [
+ #include <linux/ktime.h>
+],[
+ ktime_t start = ktime_set(0, 0);
+ ktime_t end = start;
+
+ ktime_ms_delta(start, end);
+],[
+ AC_DEFINE(HAVE_KTIME_MS_DELTA, 1,
+ ['ktime_ms_delta' is available])
+])
+]) # LIBCFS_KTIME_MS_DELTA
+
+#
+# Kernel version 4.1 commit b51d23e4e9fea6f264d39535c2a62d1f51e7ccc3
+# create per module locks which added kernel_param_[un]lock(). Older
+# kernels you have to use __kernel_param_[un]lock(). In that case its
+# a global lock for all modules but that is okay since its a rare event.
+#
+AC_DEFUN([LIBCFS_KERNEL_PARAM_LOCK],[
+LB_CHECK_COMPILE([does function 'kernel_param_[un]lock' exist],
+kernel_param_lock, [
+ #include <linux/moduleparam.h>
+],[
+ kernel_param_lock(NULL);
+ kernel_param_unlock(NULL);
+],[
+ AC_DEFINE(HAVE_KERNEL_PARAM_LOCK, 1,
+ ['kernel_param_[un]lock' is available])
+])
+]) # LIBCFS_KERNEL_PARAM_LOCK
+
+#
+# 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.4 commit ef951599074ba4fad2d0efa0a977129b41e6d203
+# introduced kstrtobool and kstrtobool_from_user.
+#
+AC_DEFUN([LIBCFS_KSTRTOBOOL_FROM_USER], [
+LB_CHECK_COMPILE([if Linux kernel has 'kstrtobool_from_user'],
+kstrtobool_from_user, [