aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--config/kernel-objtool.m425
-rw-r--r--include/sys/Makefile.am1
-rw-r--r--include/sys/frame.h36
-rw-r--r--module/zcommon/zfs_fletcher_avx512.c3
-rw-r--r--module/zfs/Makefile.in5
5 files changed, 69 insertions, 1 deletions
diff --git a/config/kernel-objtool.m4 b/config/kernel-objtool.m4
index 94e7dda2d..467329b25 100644
--- a/config/kernel-objtool.m4
+++ b/config/kernel-objtool.m4
@@ -12,7 +12,30 @@ AC_DEFUN([ZFS_AC_KERNEL_OBJTOOL], [
#endif
],[
AC_MSG_RESULT(yes)
- AC_DEFINE(HAVE_KERNEL_OBJTOOL, 1, [kernel does stack verification])
+ AC_DEFINE(HAVE_KERNEL_OBJTOOL, 1,
+ [kernel does stack verification])
+
+ ZFS_AC_KERNEL_STACK_FRAME_NON_STANDARD
+ ],[
+ AC_MSG_RESULT(no)
+ ])
+])
+
+dnl #
+dnl # 4.6 API added STACK_FRAME_NON_STANDARD macro
+dnl #
+AC_DEFUN([ZFS_AC_KERNEL_STACK_FRAME_NON_STANDARD], [
+ AC_MSG_CHECKING([whether STACK_FRAME_NON_STANDARD is defined])
+ ZFS_LINUX_TRY_COMPILE([
+ #include <linux/frame.h>
+ ],[
+ #if !defined(STACK_FRAME_NON_STANDARD)
+ CTASSERT(1);
+ #endif
+ ],[
+ AC_MSG_RESULT(yes)
+ AC_DEFINE(HAVE_STACK_FRAME_NON_STANDARD, 1,
+ [STACK_FRAME_NON_STANDARD is defined])
],[
AC_MSG_RESULT(no)
])
diff --git a/include/sys/Makefile.am b/include/sys/Makefile.am
index d3835ca29..150004ddd 100644
--- a/include/sys/Makefile.am
+++ b/include/sys/Makefile.am
@@ -35,6 +35,7 @@ COMMON_H = \
$(top_srcdir)/include/sys/dsl_userhold.h \
$(top_srcdir)/include/sys/edonr.h \
$(top_srcdir)/include/sys/efi_partition.h \
+ $(top_srcdir)/include/sys/frame.h \
$(top_srcdir)/include/sys/hkdf.h \
$(top_srcdir)/include/sys/metaslab.h \
$(top_srcdir)/include/sys/metaslab_impl.h \
diff --git a/include/sys/frame.h b/include/sys/frame.h
new file mode 100644
index 000000000..2865dbb57
--- /dev/null
+++ b/include/sys/frame.h
@@ -0,0 +1,36 @@
+/*
+ * CDDL HEADER START
+ *
+ * This file and its contents are supplied under the terms of the
+ * Common Development and Distribution License ("CDDL"), version 1.0.
+ * You may only use this file in accordance with the terms of version
+ * 1.0 of the CDDL.
+ *
+ * A full copy of the text of the CDDL should have accompanied this
+ * source. A copy of the CDDL is also available via the Internet at
+ * http://www.illumos.org/license/CDDL.
+ *
+ * CDDL HEADER END
+ */
+/*
+ * Copyright (C) 2017 by Lawrence Livermore National Security, LLC.
+ */
+
+#ifndef _SYS_FRAME_H
+#define _SYS_FRAME_H
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#if defined(__KERNEL__) && defined(HAVE_STACK_FRAME_NON_STANDARD)
+#include <linux/frame.h>
+#else
+#define STACK_FRAME_NON_STANDARD(func)
+#endif
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _SYS_FRAME_H */
diff --git a/module/zcommon/zfs_fletcher_avx512.c b/module/zcommon/zfs_fletcher_avx512.c
index 2d28ffb11..ed93c1159 100644
--- a/module/zcommon/zfs_fletcher_avx512.c
+++ b/module/zcommon/zfs_fletcher_avx512.c
@@ -26,6 +26,7 @@
#include <linux/simd_x86.h>
#include <sys/byteorder.h>
+#include <sys/frame.h>
#include <sys/spa_checksum.h>
#include <zfs_fletcher.h>
#include <strings.h>
@@ -107,6 +108,7 @@ fletcher_4_avx512f_native(fletcher_4_ctx_t *ctx, const void *buf, uint64_t size)
kfpu_end();
}
+STACK_FRAME_NON_STANDARD(fletcher_4_avx512f_native);
static void
fletcher_4_avx512f_byteswap(fletcher_4_ctx_t *ctx, const void *buf,
@@ -150,6 +152,7 @@ fletcher_4_avx512f_byteswap(fletcher_4_ctx_t *ctx, const void *buf,
kfpu_end();
}
+STACK_FRAME_NON_STANDARD(fletcher_4_avx512f_byteswap);
static boolean_t
fletcher_4_avx512f_valid(void)
diff --git a/module/zfs/Makefile.in b/module/zfs/Makefile.in
index 606b0a47c..66acc536d 100644
--- a/module/zfs/Makefile.in
+++ b/module/zfs/Makefile.in
@@ -120,6 +120,11 @@ $(MODULE)-objs += dsl_destroy.o
$(MODULE)-objs += dsl_userhold.o
$(MODULE)-objs += qat_compress.o
+# Suppress incorrect warnings from versions of objtool which are not
+# aware of x86 EVEX prefix instructions used for AVX512.
+OBJECT_FILES_NON_STANDARD_vdev_raidz_math_avx512bw.o := y
+OBJECT_FILES_NON_STANDARD_vdev_raidz_math_avx512f.o := y
+
$(MODULE)-$(CONFIG_X86) += vdev_raidz_math_sse2.o
$(MODULE)-$(CONFIG_X86) += vdev_raidz_math_ssse3.o
$(MODULE)-$(CONFIG_X86) += vdev_raidz_math_avx2.o