[packages/zfs] - fix building witk kernel 5.0 - rel 2

baggins baggins at pld-linux.org
Mon Mar 11 10:50:45 CET 2019


commit 79879454102dd719ba8e436145611e92083ab2ab
Author: Jan Rękorajski <baggins at pld-linux.org>
Date:   Mon Mar 11 10:50:23 2019 +0100

    - fix building witk kernel 5.0
    - rel 2

 kernel-5.0.patch | 993 +++++++++++++++++++++++++++++++++++++++++++++++++++++++
 zfs.spec         |   4 +-
 2 files changed, 996 insertions(+), 1 deletion(-)
---
diff --git a/zfs.spec b/zfs.spec
index b39c815..0e9816e 100644
--- a/zfs.spec
+++ b/zfs.spec
@@ -29,7 +29,7 @@ exit 1
 %define		_duplicate_files_terminate_build	0
 
 %define	_rc	rc3
-%define	rel	0.%{_rc}.1
+%define	rel	0.%{_rc}.2
 %define	pname	zfs
 Summary:	Native Linux port of the ZFS filesystem
 Summary(pl.UTF-8):	Natywny linuksowy port systemu plików ZFS
@@ -43,6 +43,7 @@ Source0:	https://github.com/zfsonlinux/zfs/archive/zfs-%{version}-%{_rc}/%{pname
 # Source0-md5:	430cd26a1d246029017e9250eb00f8f2
 Patch0:		x32.patch
 Patch1:		am.patch
+Patch2:		kernel-5.0.patch
 URL:		http://zfsonlinux.org/
 BuildRequires:	autoconf >= 2.50
 BuildRequires:	automake
@@ -256,6 +257,7 @@ p=`pwd`\
 %setup -q -n %{pname}-zfs-%{version}-%{_rc}
 %patch0 -p1
 %patch1 -p1
+%patch2 -p1
 
 %build
 %{__libtoolize}
diff --git a/kernel-5.0.patch b/kernel-5.0.patch
new file mode 100644
index 0000000..87a2e36
--- /dev/null
+++ b/kernel-5.0.patch
@@ -0,0 +1,993 @@
+From 5cb46f6a664db913f0ef2bf8e929c3f8d8cbfc5b Mon Sep 17 00:00:00 2001
+From: Tony Hutter <hutter2 at llnl.gov>
+Date: Wed, 9 Jan 2019 13:16:39 -0800
+Subject: [PATCH] Linux 4.18 compat: Use ktime_get_coarse_real_ts64()
+
+Newer kernels remove current_kernel_time64().  Use
+ktime_get_coarse_real_ts64() in its place.
+
+Reviewed-by: Brian Behlendorf <behlendorf1 at llnl.gov>
+Signed-off-by: Tony Hutter <hutter2 at llnl.gov>
+Closes #8258
+---
+ config/kernel-ktime_get_coarse_real_ts64.m4 | 18 ++++++++++++++++++
+ config/kernel.m4                            |  1 +
+ include/spl/sys/time.h                      | 12 ++++++++++++
+ 3 files changed, 31 insertions(+)
+ create mode 100644 config/kernel-ktime_get_coarse_real_ts64.m4
+
+diff --git a/config/kernel-ktime_get_coarse_real_ts64.m4 b/config/kernel-ktime_get_coarse_real_ts64.m4
+new file mode 100644
+index 00000000000..d6be8c4185a
+--- /dev/null
++++ b/config/kernel-ktime_get_coarse_real_ts64.m4
+@@ -0,0 +1,18 @@
++dnl #
++dnl # 4.18: ktime_get_coarse_real_ts64() added.  Use it in place of
++dnl # current_kernel_time64().
++dnl #
++AC_DEFUN([ZFS_AC_KERNEL_KTIME_GET_COARSE_REAL_TS64],
++	[AC_MSG_CHECKING([whether ktime_get_coarse_real_ts64() exists])
++	ZFS_LINUX_TRY_COMPILE([
++		#include <linux/mm.h>
++	], [
++		struct timespec64 ts;
++		ktime_get_coarse_real_ts64(&ts);
++	], [
++		AC_MSG_RESULT(yes)
++		AC_DEFINE(HAVE_KTIME_GET_COARSE_REAL_TS64, 1, [ktime_get_coarse_real_ts64() exists])
++	], [
++		AC_MSG_RESULT(no)
++	])
++])
+diff --git a/config/kernel.m4 b/config/kernel.m4
+index 7330c00e1bd..098c4370073 100644
+--- a/config/kernel.m4
++++ b/config/kernel.m4
+@@ -161,6 +161,7 @@ AC_DEFUN([ZFS_AC_CONFIG_KERNEL], [
+ 	ZFS_AC_KERNEL_ACL_HAS_REFCOUNT
+ 	ZFS_AC_KERNEL_USERNS_CAPABILITIES
+ 	ZFS_AC_KERNEL_IN_COMPAT_SYSCALL
++	ZFS_AC_KERNEL_KTIME_GET_COARSE_REAL_TS64
+ 
+ 	AS_IF([test "$LINUX_OBJ" != "$LINUX"], [
+ 		KERNEL_MAKE="$KERNEL_MAKE O=$LINUX_OBJ"
+diff --git a/include/spl/sys/time.h b/include/spl/sys/time.h
+index 1a986c9b97c..312415b7bc8 100644
+--- a/include/spl/sys/time.h
++++ b/include/spl/sys/time.h
+@@ -73,7 +73,13 @@ static inline void
+ gethrestime(inode_timespec_t *ts)
+ {
+ #if defined(HAVE_INODE_TIMESPEC64_TIMES)
++
++#if defined(HAVE_KTIME_GET_COARSE_REAL_TS64)
++	ktime_get_coarse_real_ts64(ts);
++#else
+ 	*ts = current_kernel_time64();
++#endif /* HAVE_KTIME_GET_COARSE_REAL_TS64 */
++
+ #else
+ 	*ts = current_kernel_time();
+ #endif
+@@ -83,7 +89,13 @@ static inline time_t
+ gethrestime_sec(void)
+ {
+ #if defined(HAVE_INODE_TIMESPEC64_TIMES)
++#if defined(HAVE_KTIME_GET_COARSE_REAL_TS64)
++	inode_timespec_t ts;
++	ktime_get_coarse_real_ts64(&ts);
++#else
+ 	inode_timespec_t ts = current_kernel_time64();
++#endif  /* HAVE_KTIME_GET_COARSE_REAL_TS64 */
++
+ #else
+ 	inode_timespec_t ts = current_kernel_time();
+ #endif
+From 77e50c3070a0009c4ed8b50dbb7cf0df48bdda90 Mon Sep 17 00:00:00 2001
+From: Tony Hutter <hutter2 at llnl.gov>
+Date: Thu, 10 Jan 2019 11:03:40 -0800
+Subject: [PATCH] Linux 5.0 compat: access_ok() drops 'type' parameter
+
+access_ok no longer needs a 'type' parameter in the 5.0 kernel.
+
+Reviewed-by: Brian Behlendorf <behlendorf1 at llnl.gov>
+Signed-off-by: Tony Hutter <hutter2 at llnl.gov>
+Closes #8261
+---
+ config/kernel-access-ok-type.m4 | 21 +++++++++++++++++++++
+ config/kernel.m4                |  1 +
+ include/linux/kmap_compat.h     |  8 ++++++++
+ module/zcommon/zfs_uio.c        |  3 +--
+ 4 files changed, 31 insertions(+), 2 deletions(-)
+ create mode 100644 config/kernel-access-ok-type.m4
+
+diff --git a/config/kernel-access-ok-type.m4 b/config/kernel-access-ok-type.m4
+new file mode 100644
+index 00000000000..3b2878a55cb
+--- /dev/null
++++ b/config/kernel-access-ok-type.m4
+@@ -0,0 +1,21 @@
++dnl #
++dnl # Linux 5.0: access_ok() drops 'type' parameter:
++dnl #
++dnl # - access_ok(type, addr, size)
++dnl # + access_ok(addr, size)
++dnl #
++AC_DEFUN([ZFS_AC_KERNEL_ACCESS_OK_TYPE], [
++	AC_MSG_CHECKING([whether access_ok() has 'type' parameter])
++	ZFS_LINUX_TRY_COMPILE([
++		#include <linux/uaccess.h>
++	],[
++		const void __user __attribute__((unused)) *addr = (void *) 0xdeadbeef;
++		unsigned long __attribute__((unused)) size = 1;
++		int error __attribute__((unused)) = access_ok(0, addr, size);
++	],[
++		AC_MSG_RESULT(yes)
++		AC_DEFINE(HAVE_ACCESS_OK_TYPE, 1, [kernel has access_ok with 'type' parameter])
++	],[
++		AC_MSG_RESULT(no)
++	])
++])
+diff --git a/config/kernel.m4 b/config/kernel.m4
+index 098c4370073..ea04d85b6cd 100644
+--- a/config/kernel.m4
++++ b/config/kernel.m4
+@@ -4,6 +4,7 @@ dnl #
+ AC_DEFUN([ZFS_AC_CONFIG_KERNEL], [
+ 	ZFS_AC_KERNEL
+ 	ZFS_AC_QAT
++	ZFS_AC_KERNEL_ACCESS_OK_TYPE
+ 	ZFS_AC_TEST_MODULE
+ 	ZFS_AC_KERNEL_MISC_MINOR
+ 	ZFS_AC_KERNEL_OBJTOOL
+diff --git a/include/linux/kmap_compat.h b/include/linux/kmap_compat.h
+index 59ae566ce9d..b9c7f5bcc9d 100644
+--- a/include/linux/kmap_compat.h
++++ b/include/linux/kmap_compat.h
+@@ -27,6 +27,7 @@
+ #define	_ZFS_KMAP_H
+ 
+ #include <linux/highmem.h>
++#include <linux/uaccess.h>
+ 
+ #ifdef HAVE_1ARG_KMAP_ATOMIC
+ /* 2.6.37 API change */
+@@ -37,4 +38,11 @@
+ #define	zfs_kunmap_atomic(addr, km_type)	kunmap_atomic(addr, km_type)
+ #endif
+ 
++/* 5.0 API change - no more 'type' argument for access_ok() */
++#ifdef HAVE_ACCESS_OK_TYPE
++#define	zfs_access_ok(type, addr, size)	access_ok(type, addr, size)
++#else
++#define	zfs_access_ok(type, addr, size)	access_ok(addr, size)
++#endif
++
+ #endif	/* _ZFS_KMAP_H */
+diff --git a/module/zcommon/zfs_uio.c b/module/zcommon/zfs_uio.c
+index a2c1b5c3aaf..c1e31f51be0 100644
+--- a/module/zcommon/zfs_uio.c
++++ b/module/zcommon/zfs_uio.c
+@@ -81,11 +81,10 @@ uiomove_iov(void *p, size_t n, enum uio_rw rw, struct uio *uio)
+ 					return (EFAULT);
+ 			} else {
+ 				if (uio->uio_fault_disable) {
+-					if (!access_ok(VERIFY_READ,
++					if (!zfs_access_ok(VERIFY_READ,
+ 					    (iov->iov_base + skip), cnt)) {
+ 						return (EFAULT);
+ 					}
+-
+ 					pagefault_disable();
+ 					if (__copy_from_user_inatomic(p,
+ 					    (iov->iov_base + skip), cnt)) {
+From 031cea17a3db1dae3b6968a8c71bcfb678a03235 Mon Sep 17 00:00:00 2001
+From: Tony Hutter <hutter2 at llnl.gov>
+Date: Thu, 10 Jan 2019 14:28:10 -0800
+Subject: [PATCH] Linux 5.0 compat: Use totalram_pages()
+
+totalram_pages() was converted to an atomic variable in 5.0:
+
+https://patchwork.kernel.org/patch/10652795/
+
+Its value should now be read though the totalram_pages() helper
+function.
+
+Reviewed-by: Brian Behlendorf <behlendorf1 at llnl.gov>
+Signed-off-by: Tony Hutter <hutter2 at llnl.gov>
+Closes #8263
+---
+ config/kernel-totalram-pages-func.m4 | 18 ++++++++++++++++++
+ config/kernel.m4                     |  1 +
+ include/spl/sys/vmsystm.h            |  8 +++++++-
+ module/zfs/arc.c                     |  4 ++--
+ 4 files changed, 28 insertions(+), 3 deletions(-)
+ create mode 100644 config/kernel-totalram-pages-func.m4
+
+diff --git a/config/kernel-totalram-pages-func.m4 b/config/kernel-totalram-pages-func.m4
+new file mode 100644
+index 00000000000..a6eac645431
+--- /dev/null
++++ b/config/kernel-totalram-pages-func.m4
+@@ -0,0 +1,18 @@
++dnl #
++dnl # Linux 5.0: totalram_pages is no longer a global variable, and must be
++dnl # read via the totalram_pages() helper function.
++dnl #
++AC_DEFUN([ZFS_AC_KERNEL_TOTALRAM_PAGES_FUNC], [
++	AC_MSG_CHECKING([whether totalram_pages() exists])
++	ZFS_LINUX_TRY_COMPILE([
++		#include <linux/mm.h>
++	],[
++		unsigned long pages __attribute__ ((unused));
++		pages = totalram_pages();
++	],[
++		AC_MSG_RESULT(yes)
++		AC_DEFINE(HAVE_TOTALRAM_PAGES_FUNC, 1, [kernel has totalram_pages()])
++	],[
++		AC_MSG_RESULT(no)
++	])
++])
+diff --git a/config/kernel.m4 b/config/kernel.m4
+index ea04d85b6cd..e4d0e3393b6 100644
+--- a/config/kernel.m4
++++ b/config/kernel.m4
+@@ -163,6 +163,7 @@ AC_DEFUN([ZFS_AC_CONFIG_KERNEL], [
+ 	ZFS_AC_KERNEL_USERNS_CAPABILITIES
+ 	ZFS_AC_KERNEL_IN_COMPAT_SYSCALL
+ 	ZFS_AC_KERNEL_KTIME_GET_COARSE_REAL_TS64
++	ZFS_AC_KERNEL_TOTALRAM_PAGES_FUNC
+ 
+ 	AS_IF([test "$LINUX_OBJ" != "$LINUX"], [
+ 		KERNEL_MAKE="$KERNEL_MAKE O=$LINUX_OBJ"
+diff --git a/include/spl/sys/vmsystm.h b/include/spl/sys/vmsystm.h
+index 2b48fe0e369..6bdfc852ac0 100644
+--- a/include/spl/sys/vmsystm.h
++++ b/include/spl/sys/vmsystm.h
+@@ -33,8 +33,14 @@
+ #include <sys/types.h>
+ #include <asm/uaccess.h>
+ 
++#ifdef HAVE_TOTALRAM_PAGES_FUNC
++#define	zfs_totalram_pages	totalram_pages()
++#else
++#define	zfs_totalram_pages	totalram_pages
++#endif
++
+ #define	membar_producer()		smp_wmb()
+-#define	physmem				totalram_pages
++#define	physmem				zfs_totalram_pages
+ #define	freemem			(nr_free_pages() + \
+ 				global_page_state(NR_INACTIVE_FILE) + \
+ 				global_page_state(NR_INACTIVE_ANON) + \
+diff --git a/module/zfs/arc.c b/module/zfs/arc.c
+index 7e09633345d..f5d94cbf90a 100644
+--- a/module/zfs/arc.c
++++ b/module/zfs/arc.c
+@@ -4821,9 +4821,9 @@ arc_all_memory(void)
+ {
+ #ifdef _KERNEL
+ #ifdef CONFIG_HIGHMEM
+-	return (ptob(totalram_pages - totalhigh_pages));
++	return (ptob(zfs_totalram_pages - totalhigh_pages));
+ #else
+-	return (ptob(totalram_pages));
++	return (ptob(zfs_totalram_pages));
+ #endif /* CONFIG_HIGHMEM */
+ #else
+ 	return (ptob(physmem) / 2);
+From 05805494dd7ea3b2fbb34ac031c338a8bc0bab62 Mon Sep 17 00:00:00 2001
+From: Tony Hutter <hutter2 at llnl.gov>
+Date: Thu, 10 Jan 2019 15:28:44 -0800
+Subject: [PATCH] Linux 5.0 compat: Convert MS_* macros to SB_*
+
+In the 5.0 kernel, only the mount namespace code should use the MS_*
+macos. Filesystems should use the SB_* ones.
+
+https://patchwork.kernel.org/patch/10552493/
+
+Reviewed-by: Brian Behlendorf <behlendorf1 at llnl.gov>
+Signed-off-by: Tony Hutter <hutter2 at llnl.gov>
+Closes #8264
+---
+ module/zfs/vdev_disk.c  |  3 ++-
+ module/zfs/zfs_vfsops.c | 23 ++++++++++++-----------
+ 2 files changed, 14 insertions(+), 12 deletions(-)
+
+diff --git a/module/zfs/vdev_disk.c b/module/zfs/vdev_disk.c
+index d13f365dd05..c53a0aa0fcb 100644
+--- a/module/zfs/vdev_disk.c
++++ b/module/zfs/vdev_disk.c
+@@ -35,6 +35,7 @@
+ #include <sys/zio.h>
+ #include <linux/mod_compat.h>
+ #include <linux/msdos_fs.h>
++#include <linux/vfs_compat.h>
+ 
+ char *zfs_vdev_scheduler = VDEV_SCHEDULER;
+ static void *zfs_vdev_holder = VDEV_HOLDER;
+@@ -79,7 +80,7 @@ vdev_bdev_mode(int smode)
+ 	ASSERT3S(smode & (FREAD | FWRITE), !=, 0);
+ 
+ 	if ((smode & FREAD) && !(smode & FWRITE))
+-		mode = MS_RDONLY;
++		mode = SB_RDONLY;
+ 
+ 	return (mode);
+ }
+diff --git a/module/zfs/zfs_vfsops.c b/module/zfs/zfs_vfsops.c
+index c9e314caa22..766cbab7436 100644
+--- a/module/zfs/zfs_vfsops.c
++++ b/module/zfs/zfs_vfsops.c
+@@ -56,6 +56,7 @@
+ #include <sys/dmu_objset.h>
+ #include <sys/spa_boot.h>
+ #include <sys/zpl.h>
++#include <linux/vfs_compat.h>
+ #include "zfs_comutil.h"
+ 
+ enum {
+@@ -249,7 +250,7 @@ zfsvfs_parse_options(char *mntopts, vfs_t **vfsp)
+ boolean_t
+ zfs_is_readonly(zfsvfs_t *zfsvfs)
+ {
+-	return (!!(zfsvfs->z_sb->s_flags & MS_RDONLY));
++	return (!!(zfsvfs->z_sb->s_flags & SB_RDONLY));
+ }
+ 
+ /*ARGSUSED*/
+@@ -336,15 +337,15 @@ acltype_changed_cb(void *arg, uint64_t newval)
+ 	switch (newval) {
+ 	case ZFS_ACLTYPE_OFF:
+ 		zfsvfs->z_acl_type = ZFS_ACLTYPE_OFF;
+-		zfsvfs->z_sb->s_flags &= ~MS_POSIXACL;
++		zfsvfs->z_sb->s_flags &= ~SB_POSIXACL;
+ 		break;
+ 	case ZFS_ACLTYPE_POSIXACL:
+ #ifdef CONFIG_FS_POSIX_ACL
+ 		zfsvfs->z_acl_type = ZFS_ACLTYPE_POSIXACL;
+-		zfsvfs->z_sb->s_flags |= MS_POSIXACL;
++		zfsvfs->z_sb->s_flags |= SB_POSIXACL;
+ #else
+ 		zfsvfs->z_acl_type = ZFS_ACLTYPE_OFF;
+-		zfsvfs->z_sb->s_flags &= ~MS_POSIXACL;
++		zfsvfs->z_sb->s_flags &= ~SB_POSIXACL;
+ #endif /* CONFIG_FS_POSIX_ACL */
+ 		break;
+ 	default:
+@@ -373,9 +374,9 @@ readonly_changed_cb(void *arg, uint64_t newval)
+ 		return;
+ 
+ 	if (newval)
+-		sb->s_flags |= MS_RDONLY;
++		sb->s_flags |= SB_RDONLY;
+ 	else
+-		sb->s_flags &= ~MS_RDONLY;
++		sb->s_flags &= ~SB_RDONLY;
+ }
+ 
+ static void
+@@ -403,9 +404,9 @@ nbmand_changed_cb(void *arg, uint64_t newval)
+ 		return;
+ 
+ 	if (newval == TRUE)
+-		sb->s_flags |= MS_MANDLOCK;
++		sb->s_flags |= SB_MANDLOCK;
+ 	else
+-		sb->s_flags &= ~MS_MANDLOCK;
++		sb->s_flags &= ~SB_MANDLOCK;
+ }
+ 
+ static void
+@@ -1954,8 +1955,8 @@ zfs_remount(struct super_block *sb, int *flags, zfs_mnt_t *zm)
+ 	int error;
+ 
+ 	if ((issnap || !spa_writeable(dmu_objset_spa(zfsvfs->z_os))) &&
+-	    !(*flags & MS_RDONLY)) {
+-		*flags |= MS_RDONLY;
++	    !(*flags & SB_RDONLY)) {
++		*flags |= SB_RDONLY;
+ 		return (EROFS);
+ 	}
+ 
+@@ -1963,7 +1964,7 @@ zfs_remount(struct super_block *sb, int *flags, zfs_mnt_t *zm)
+ 	if (error)
+ 		return (error);
+ 
+-	if (!zfs_is_readonly(zfsvfs) && (*flags & MS_RDONLY))
++	if (!zfs_is_readonly(zfsvfs) && (*flags & SB_RDONLY))
+ 		txg_wait_synced(dmu_objset_pool(zfsvfs->z_os), 0);
+ 
+ 	zfs_unregister_callbacks(zfsvfs);
+From ed158b19b1dddf26f2bbebb4d0fd21f04fdd5d38 Mon Sep 17 00:00:00 2001
+From: Tony Hutter <hutter2 at llnl.gov>
+Date: Thu, 10 Jan 2019 17:07:05 -0800
+Subject: [PATCH] Linux 5.0 compat: Fix SUBDIRs
+
+SUBDIRs has been deprecated for a long time, and was finally removed in
+the 5.0 kernel.  Use "M=" instead.
+
+Reviewed-by: Brian Behlendorf <behlendorf1 at llnl.gov>
+Signed-off-by: Tony Hutter <hutter2 at llnl.gov>
+Closes #8257
+---
+ module/Makefile.in | 6 +++---
+ 1 file changed, 3 insertions(+), 3 deletions(-)
+
+diff --git a/module/Makefile.in b/module/Makefile.in
+index 82d155dd31a..935bd266306 100644
+--- a/module/Makefile.in
++++ b/module/Makefile.in
+@@ -29,12 +29,12 @@ modules:
+ 	list='$(SUBDIR_TARGETS)'; for targetdir in $$list; do \
+ 		$(MAKE) -C $$targetdir; \
+ 	done
+-	$(MAKE) -C @LINUX_OBJ@ SUBDIRS=`pwd` @KERNEL_MAKE@ CONFIG_ZFS=m $@
++	$(MAKE) -C @LINUX_OBJ@ M=`pwd` @KERNEL_MAKE@ CONFIG_ZFS=m $@
+ 
+ clean:
+ 	@# Only cleanup the kernel build directories when CONFIG_KERNEL
+ 	@# is defined.  This indicates that kernel modules should be built.
+- at CONFIG_KERNEL_TRUE@	$(MAKE) -C @LINUX_OBJ@ SUBDIRS=`pwd` @KERNEL_MAKE@ $@
++ at CONFIG_KERNEL_TRUE@	$(MAKE) -C @LINUX_OBJ@ M=`pwd` @KERNEL_MAKE@ $@
+ 
+ 	if [ -f @LINUX_SYMBOLS@ ]; then $(RM) @LINUX_SYMBOLS@; fi
+ 	if [ -f Module.markers ]; then $(RM) Module.markers; fi
+@@ -43,7 +43,7 @@ clean:
+ 
+ modules_install:
+ 	@# Install the kernel modules
+-	$(MAKE) -C @LINUX_OBJ@ SUBDIRS=`pwd` $@ \
++	$(MAKE) -C @LINUX_OBJ@ M=`pwd` $@ \
+ 		INSTALL_MOD_PATH=$(DESTDIR)$(INSTALL_MOD_PATH) \
+ 		INSTALL_MOD_DIR=$(INSTALL_MOD_DIR) \
+ 		KERNELRELEASE=@LINUX_VERSION@
+From 0c593296e98e3ac95f14704e4cee6cedb2134990 Mon Sep 17 00:00:00 2001
+From: Tony Hutter <hutter2 at llnl.gov>
+Date: Fri, 11 Jan 2019 18:01:28 -0800
+Subject: [PATCH] Linux 5.0 compat: Disable vector instructions on 5.0+ kernels
+
+The 5.0 kernel no longer exports the functions we need to do vector
+(SSE/SSE2/SSE3/AVX...) instructions.  Disable vector-based checksum
+algorithms when building against those kernels.
+
+Reviewed-by: Brian Behlendorf <behlendorf1 at llnl.gov>
+Signed-off-by: Tony Hutter <hutter2 at llnl.gov>
+Closes #8259
+---
+ config/kernel-fpu.m4     |  41 ++++++++---
+ include/linux/simd_x86.h | 142 ++++++++++++++++++++++++++++++---------
+ 2 files changed, 144 insertions(+), 39 deletions(-)
+
+diff --git a/config/kernel-fpu.m4 b/config/kernel-fpu.m4
+index 1c5690969d4..671fe7ea54e 100644
+--- a/config/kernel-fpu.m4
++++ b/config/kernel-fpu.m4
+@@ -1,18 +1,41 @@
++dnl # 
++dnl # Handle differences in kernel FPU code.
+ dnl #
+-dnl # 4.2 API change
+-dnl # asm/i387.h is replaced by asm/fpu/api.h
++dnl # Kernel
++dnl # 5.0:	All kernel fpu functions are GPL only, so we can't use them.
++dnl #		(nothing defined)
++dnl #
++dnl # 4.2:	Use __kernel_fpu_{begin,end}()
++dnl #		HAVE_UNDERSCORE_KERNEL_FPU & KERNEL_EXPORTS_X86_FPU
++dnl #
++dnl # Pre-4.2:	Use kernel_fpu_{begin,end}()
++dnl #		HAVE_KERNEL_FPU & KERNEL_EXPORTS_X86_FPU
+ dnl #
+ AC_DEFUN([ZFS_AC_KERNEL_FPU], [
+-	AC_MSG_CHECKING([whether asm/fpu/api.h exists])
++	AC_MSG_CHECKING([which kernel_fpu function to use])
+ 	ZFS_LINUX_TRY_COMPILE([
+-		#include <linux/kernel.h>
+-		#include <asm/fpu/api.h>
++		#include <asm/i387.h>
++		#include <asm/xcr.h>
+ 	],[
+-		__kernel_fpu_begin();
++		kernel_fpu_begin();
++		kernel_fpu_end();
+ 	],[
+-		AC_MSG_RESULT(yes)
+-		AC_DEFINE(HAVE_FPU_API_H, 1, [kernel has <asm/fpu/api.h> interface])
++		AC_MSG_RESULT(kernel_fpu_*)
++		AC_DEFINE(HAVE_KERNEL_FPU, 1, [kernel has kernel_fpu_* functions])
++		AC_DEFINE(KERNEL_EXPORTS_X86_FPU, 1, [kernel exports FPU functions])
+ 	],[
+-		AC_MSG_RESULT(no)
++		ZFS_LINUX_TRY_COMPILE([
++			#include <linux/kernel.h>
++			#include <asm/fpu/api.h>
++		],[
++			__kernel_fpu_begin();
++			__kernel_fpu_end();
++		],[
++			AC_MSG_RESULT(__kernel_fpu_*)
++			AC_DEFINE(HAVE_UNDERSCORE_KERNEL_FPU, 1, [kernel has __kernel_fpu_* functions])
++			AC_DEFINE(KERNEL_EXPORTS_X86_FPU, 1, [kernel exports FPU functions])
++		],[
++			AC_MSG_RESULT(not exported)
++		])
+ 	])
+ ])
+diff --git a/include/linux/simd_x86.h b/include/linux/simd_x86.h
+index 10ce02e3746..5d6fbed35b9 100644
+--- a/include/linux/simd_x86.h
++++ b/include/linux/simd_x86.h
+@@ -81,7 +81,7 @@
+ #endif
+ 
+ #if defined(_KERNEL)
+-#if defined(HAVE_FPU_API_H)
++#if defined(HAVE_UNDERSCORE_KERNEL_FPU)
+ #include <asm/fpu/api.h>
+ #include <asm/fpu/internal.h>
+ #define	kfpu_begin()		\
+@@ -94,12 +94,18 @@
+ 	__kernel_fpu_end();		\
+ 	preempt_enable();		\
+ }
+-#else
++#elif defined(HAVE_KERNEL_FPU)
+ #include <asm/i387.h>
+ #include <asm/xcr.h>
+ #define	kfpu_begin()	kernel_fpu_begin()
+ #define	kfpu_end()		kernel_fpu_end()
+-#endif /* defined(HAVE_FPU_API_H) */
++#else
++/* Kernel doesn't export any kernel_fpu_* functions */
++#include <asm/fpu/internal.h>	/* For kernel xgetbv() */
++#define	kfpu_begin() 	panic("This code should never run")
++#define	kfpu_end() 	panic("This code should never run")
++#endif /* defined(HAVE_KERNEL_FPU) */
++
+ #else
+ /*
+  * fpu dummy methods for userspace
+@@ -286,11 +292,13 @@ __simd_state_enabled(const uint64_t state)
+ 	boolean_t has_osxsave;
+ 	uint64_t xcr0;
+ 
+-#if defined(_KERNEL) && defined(X86_FEATURE_OSXSAVE)
++#if defined(_KERNEL)
++#if defined(X86_FEATURE_OSXSAVE) && defined(KERNEL_EXPORTS_X86_FPU)
+ 	has_osxsave = !!boot_cpu_has(X86_FEATURE_OSXSAVE);
+-#elif defined(_KERNEL) && !defined(X86_FEATURE_OSXSAVE)
+-	has_osxsave = B_FALSE;
+ #else
++	has_osxsave = B_FALSE;
++#endif
++#elif !defined(_KERNEL)
+ 	has_osxsave = __cpuid_has_osxsave();
+ #endif
+ 
+@@ -315,8 +323,12 @@ static inline boolean_t
+ zfs_sse_available(void)
+ {
+ #if defined(_KERNEL)
++#if defined(KERNEL_EXPORTS_X86_FPU)
+ 	return (!!boot_cpu_has(X86_FEATURE_XMM));
+ #else
++	return (B_FALSE);
++#endif
++#elif !defined(_KERNEL)
+ 	return (__cpuid_has_sse());
+ #endif
+ }
+@@ -328,8 +340,12 @@ static inline boolean_t
+ zfs_sse2_available(void)
+ {
+ #if defined(_KERNEL)
++#if defined(KERNEL_EXPORTS_X86_FPU)
+ 	return (!!boot_cpu_has(X86_FEATURE_XMM2));
+ #else
++	return (B_FALSE);
++#endif
++#elif !defined(_KERNEL)
+ 	return (__cpuid_has_sse2());
+ #endif
+ }
+@@ -341,8 +357,12 @@ static inline boolean_t
+ zfs_sse3_available(void)
+ {
+ #if defined(_KERNEL)
++#if defined(KERNEL_EXPORTS_X86_FPU)
+ 	return (!!boot_cpu_has(X86_FEATURE_XMM3));
+ #else
++	return (B_FALSE);
++#endif
++#elif !defined(_KERNEL)
+ 	return (__cpuid_has_sse3());
+ #endif
+ }
+@@ -354,8 +374,12 @@ static inline boolean_t
+ zfs_ssse3_available(void)
+ {
+ #if defined(_KERNEL)
++#if defined(KERNEL_EXPORTS_X86_FPU)
+ 	return (!!boot_cpu_has(X86_FEATURE_SSSE3));
+ #else
++	return (B_FALSE);
++#endif
++#elif !defined(_KERNEL)
+ 	return (__cpuid_has_ssse3());
+ #endif
+ }
+@@ -367,8 +391,12 @@ static inline boolean_t
+ zfs_sse4_1_available(void)
+ {
+ #if defined(_KERNEL)
++#if defined(KERNEL_EXPORTS_X86_FPU)
+ 	return (!!boot_cpu_has(X86_FEATURE_XMM4_1));
+ #else
++	return (B_FALSE);
++#endif
++#elif !defined(_KERNEL)
+ 	return (__cpuid_has_sse4_1());
+ #endif
+ }
+@@ -380,8 +408,12 @@ static inline boolean_t
+ zfs_sse4_2_available(void)
+ {
+ #if defined(_KERNEL)
++#if defined(KERNEL_EXPORTS_X86_FPU)
+ 	return (!!boot_cpu_has(X86_FEATURE_XMM4_2));
+ #else
++	return (B_FALSE);
++#endif
++#elif !defined(_KERNEL)
+ 	return (__cpuid_has_sse4_2());
+ #endif
+ }
+@@ -394,8 +426,12 @@ zfs_avx_available(void)
+ {
+ 	boolean_t has_avx;
+ #if defined(_KERNEL)
++#if defined(KERNEL_EXPORTS_X86_FPU)
+ 	has_avx = !!boot_cpu_has(X86_FEATURE_AVX);
+ #else
++	has_avx = B_FALSE;
++#endif
++#elif !defined(_KERNEL)
+ 	has_avx = __cpuid_has_avx();
+ #endif
+ 
+@@ -409,11 +445,13 @@ static inline boolean_t
+ zfs_avx2_available(void)
+ {
+ 	boolean_t has_avx2;
+-#if defined(_KERNEL) && defined(X86_FEATURE_AVX2)
++#if defined(_KERNEL)
++#if defined(X86_FEATURE_AVX2) && defined(KERNEL_EXPORTS_X86_FPU)
+ 	has_avx2 = !!boot_cpu_has(X86_FEATURE_AVX2);
+-#elif defined(_KERNEL) && !defined(X86_FEATURE_AVX2)
+-	has_avx2 = B_FALSE;
+ #else
++	has_avx2 = B_FALSE;
++#endif
++#elif !defined(_KERNEL)
+ 	has_avx2 = __cpuid_has_avx2();
+ #endif
+ 
+@@ -426,11 +464,13 @@ zfs_avx2_available(void)
+ static inline boolean_t
+ zfs_bmi1_available(void)
+ {
+-#if defined(_KERNEL) && defined(X86_FEATURE_BMI1)
++#if defined(_KERNEL)
++#if defined(X86_FEATURE_BMI1) && defined(KERNEL_EXPORTS_X86_FPU)
+ 	return (!!boot_cpu_has(X86_FEATURE_BMI1));
+-#elif defined(_KERNEL) && !defined(X86_FEATURE_BMI1)
+-	return (B_FALSE);
+ #else
++	return (B_FALSE);
++#endif
++#elif !defined(_KERNEL)
+ 	return (__cpuid_has_bmi1());
+ #endif
+ }
+@@ -441,11 +481,13 @@ zfs_bmi1_available(void)
+ static inline boolean_t
+ zfs_bmi2_available(void)
+ {
+-#if defined(_KERNEL) && defined(X86_FEATURE_BMI2)
++#if defined(_KERNEL)
++#if defined(X86_FEATURE_BMI2) && defined(KERNEL_EXPORTS_X86_FPU)
+ 	return (!!boot_cpu_has(X86_FEATURE_BMI2));
+-#elif defined(_KERNEL) && !defined(X86_FEATURE_BMI2)
+-	return (B_FALSE);
+ #else
++	return (B_FALSE);
++#endif
++#elif !defined(_KERNEL)
+ 	return (__cpuid_has_bmi2());
+ #endif
+ }
+@@ -456,11 +498,13 @@ zfs_bmi2_available(void)
+ static inline boolean_t
+ zfs_aes_available(void)
+ {
+-#if defined(_KERNEL) && defined(X86_FEATURE_AES)
++#if defined(_KERNEL)
++#if defined(X86_FEATURE_AES) && defined(KERNEL_EXPORTS_X86_FPU)
+ 	return (!!boot_cpu_has(X86_FEATURE_AES));
+-#elif defined(_KERNEL) && !defined(X86_FEATURE_AES)
+-	return (B_FALSE);
+ #else
++	return (B_FALSE);
++#endif
++#elif !defined(_KERNEL)
+ 	return (__cpuid_has_aes());
+ #endif
+ }
+@@ -471,11 +515,13 @@ zfs_aes_available(void)
+ static inline boolean_t
+ zfs_pclmulqdq_available(void)
+ {
+-#if defined(_KERNEL) && defined(X86_FEATURE_PCLMULQDQ)
++#if defined(_KERNEL)
++#if defined(X86_FEATURE_PCLMULQDQ) && defined(KERNEL_EXPORTS_X86_FPU)
+ 	return (!!boot_cpu_has(X86_FEATURE_PCLMULQDQ));
+-#elif defined(_KERNEL) && !defined(X86_FEATURE_PCLMULQDQ)
+-	return (B_FALSE);
+ #else
++	return (B_FALSE);
++#endif
++#elif !defined(_KERNEL)
+ 	return (__cpuid_has_pclmulqdq());
+ #endif
+ }
+@@ -503,8 +549,12 @@ zfs_avx512f_available(void)
+ {
+ 	boolean_t has_avx512 = B_FALSE;
+ 
+-#if defined(_KERNEL) && defined(X86_FEATURE_AVX512F)
++#if defined(_KERNEL)
++#if defined(X86_FEATURE_AVX512F) && defined(KERNEL_EXPORTS_X86_FPU)
+ 	has_avx512 = !!boot_cpu_has(X86_FEATURE_AVX512F);
++#else
++	has_avx512 = B_FALSE;
++#endif
+ #elif !defined(_KERNEL)
+ 	has_avx512 = __cpuid_has_avx512f();
+ #endif
+@@ -518,9 +568,13 @@ zfs_avx512cd_available(void)
+ {
+ 	boolean_t has_avx512 = B_FALSE;
+ 
+-#if defined(_KERNEL) && defined(X86_FEATURE_AVX512CD)
++#if defined(_KERNEL)
++#if defined(X86_FEATURE_AVX512CD) && defined(KERNEL_EXPORTS_X86_FPU)
+ 	has_avx512 = boot_cpu_has(X86_FEATURE_AVX512F) &&
+ 	    boot_cpu_has(X86_FEATURE_AVX512CD);
++#else
++	has_avx512 = B_FALSE;
++#endif
+ #elif !defined(_KERNEL)
+ 	has_avx512 = __cpuid_has_avx512cd();
+ #endif
+@@ -534,9 +588,13 @@ zfs_avx512er_available(void)
+ {
+ 	boolean_t has_avx512 = B_FALSE;
+ 
+-#if defined(_KERNEL) && defined(X86_FEATURE_AVX512ER)
++#if defined(_KERNEL)
++#if defined(X86_FEATURE_AVX512ER) && defined(KERNEL_EXPORTS_X86_FPU)
+ 	has_avx512 = boot_cpu_has(X86_FEATURE_AVX512F) &&
+ 	    boot_cpu_has(X86_FEATURE_AVX512ER);
++#else
++	has_avx512 = B_FALSE;
++#endif
+ #elif !defined(_KERNEL)
+ 	has_avx512 = __cpuid_has_avx512er();
+ #endif
+@@ -550,9 +608,13 @@ zfs_avx512pf_available(void)
+ {
+ 	boolean_t has_avx512 = B_FALSE;
+ 
+-#if defined(_KERNEL) && defined(X86_FEATURE_AVX512PF)
++#if defined(_KERNEL)
++#if defined(X86_FEATURE_AVX512PF) && defined(KERNEL_EXPORTS_X86_FPU)
+ 	has_avx512 = boot_cpu_has(X86_FEATURE_AVX512F) &&
+ 	    boot_cpu_has(X86_FEATURE_AVX512PF);
++#else
++	has_avx512 = B_FALSE;
++#endif
+ #elif !defined(_KERNEL)
+ 	has_avx512 = __cpuid_has_avx512pf();
+ #endif
+@@ -566,9 +628,13 @@ zfs_avx512bw_available(void)
+ {
+ 	boolean_t has_avx512 = B_FALSE;
+ 
+-#if defined(_KERNEL) && defined(X86_FEATURE_AVX512BW)
++#if defined(_KERNEL)
++#if defined(X86_FEATURE_AVX512BW) && defined(KERNEL_EXPORTS_X86_FPU)
+ 	has_avx512 = boot_cpu_has(X86_FEATURE_AVX512F) &&
+ 	    boot_cpu_has(X86_FEATURE_AVX512BW);
++#else
++	has_avx512 = B_FALSE;
++#endif
+ #elif !defined(_KERNEL)
+ 	has_avx512 = __cpuid_has_avx512bw();
+ #endif
+@@ -582,9 +648,13 @@ zfs_avx512dq_available(void)
+ {
+ 	boolean_t has_avx512 = B_FALSE;
+ 
+-#if defined(_KERNEL) && defined(X86_FEATURE_AVX512DQ)
++#if defined(_KERNEL)
++#if defined(X86_FEATURE_AVX512DQ) && defined(KERNEL_EXPORTS_X86_FPU)
+ 	has_avx512 = boot_cpu_has(X86_FEATURE_AVX512F) &&
+ 	    boot_cpu_has(X86_FEATURE_AVX512DQ);
++#else
++	has_avx512 = B_FALSE;
++#endif
+ #elif !defined(_KERNEL)
+ 	has_avx512 = __cpuid_has_avx512dq();
+ #endif
+@@ -598,9 +668,13 @@ zfs_avx512vl_available(void)
+ {
+ 	boolean_t has_avx512 = B_FALSE;
+ 
+-#if defined(_KERNEL) && defined(X86_FEATURE_AVX512VL)
++#if defined(_KERNEL)
++#if defined(X86_FEATURE_AVX512VL) && defined(KERNEL_EXPORTS_X86_FPU)
+ 	has_avx512 = boot_cpu_has(X86_FEATURE_AVX512F) &&
+ 	    boot_cpu_has(X86_FEATURE_AVX512VL);
++#else
++	has_avx512 = B_FALSE;
++#endif
+ #elif !defined(_KERNEL)
+ 	has_avx512 = __cpuid_has_avx512vl();
+ #endif
+@@ -614,9 +688,13 @@ zfs_avx512ifma_available(void)
+ {
+ 	boolean_t has_avx512 = B_FALSE;
+ 
+-#if defined(_KERNEL) && defined(X86_FEATURE_AVX512IFMA)
++#if defined(_KERNEL)
++#if defined(X86_FEATURE_AVX512IFMA) && defined(KERNEL_EXPORTS_X86_FPU)
+ 	has_avx512 = boot_cpu_has(X86_FEATURE_AVX512F) &&
+ 	    boot_cpu_has(X86_FEATURE_AVX512IFMA);
++#else
++	has_avx512 = B_FALSE;
++#endif
+ #elif !defined(_KERNEL)
+ 	has_avx512 = __cpuid_has_avx512ifma();
+ #endif
+@@ -630,9 +708,13 @@ zfs_avx512vbmi_available(void)
+ {
+ 	boolean_t has_avx512 = B_FALSE;
+ 
+-#if defined(_KERNEL) && defined(X86_FEATURE_AVX512VBMI)
++#if defined(_KERNEL)
++#if defined(X86_FEATURE_AVX512VBMI) && defined(KERNEL_EXPORTS_X86_FPU)
+ 	has_avx512 = boot_cpu_has(X86_FEATURE_AVX512F) &&
+ 	    boot_cpu_has(X86_FEATURE_AVX512VBMI);
++#else
++	has_avx512 = B_FALSE;
++#endif
+ #elif !defined(_KERNEL)
+ 	has_avx512 = __cpuid_has_avx512f() &&
+ 	    __cpuid_has_avx512vbmi();
+From 26a856594f731db62446cf537659f9360261fe97 Mon Sep 17 00:00:00 2001
+From: Brian Behlendorf <behlendorf1 at llnl.gov>
+Date: Wed, 16 Jan 2019 10:39:19 -0800
+Subject: [PATCH] Linux 5.0 compat: Fix bio_set_dev()
+
+The Linux 5.0 kernel updated the bio_set_dev() macro so it calls the
+GPL-only bio_associate_blkg() symbol thus inadvertently converting
+the entire macro.  Provide a minimal version which always assigns the
+request queue's root_blkg to the bio.
+
+Reviewed-by: Brian Behlendorf <behlendorf1 at llnl.gov>
+Signed-off-by: Brian Behlendorf <behlendorf1 at llnl.gov>
+Closes #8287
+---
+ config/kernel-bio_set_dev.m4 | 35 +++++++++++++++++++++++++++++++++--
+ module/zfs/vdev_disk.c       | 29 +++++++++++++++++++++++++++--
+ 2 files changed, 60 insertions(+), 4 deletions(-)
+
+diff --git a/config/kernel-bio_set_dev.m4 b/config/kernel-bio_set_dev.m4
+index 6be873c5615..71d47a89309 100644
+--- a/config/kernel-bio_set_dev.m4
++++ b/config/kernel-bio_set_dev.m4
+@@ -1,10 +1,10 @@
+ dnl #
+ dnl # Linux 4.14 API,
+ dnl #
+-dnl # The bio_set_dev() helper was introduced as part of the transition
++dnl # The bio_set_dev() helper macro was introduced as part of the transition
+ dnl # to have struct gendisk in struct bio. 
+ dnl #
+-AC_DEFUN([ZFS_AC_KERNEL_BIO_SET_DEV], [
++AC_DEFUN([ZFS_AC_KERNEL_BIO_SET_DEV_MACRO], [
+ 	AC_MSG_CHECKING([whether bio_set_dev() exists])
+ 	ZFS_LINUX_TRY_COMPILE([
+ 		#include <linux/bio.h>
+@@ -20,3 +20,34 @@ AC_DEFUN([ZFS_AC_KERNEL_BIO_SET_DEV], [
+ 		AC_MSG_RESULT(no)
+ 	])
+ ])
++
++dnl #
++dnl # Linux 5.0 API,
++dnl #
++dnl # The bio_set_dev() helper macro was updated to internally depend on
++dnl # bio_associate_blkg() symbol which is exported GPL-only.
++dnl #
++AC_DEFUN([ZFS_AC_KERNEL_BIO_SET_DEV_GPL_ONLY], [
++	AC_MSG_CHECKING([whether bio_set_dev() is GPL-only])
++	ZFS_LINUX_TRY_COMPILE([
++		#include <linux/module.h>
++		#include <linux/bio.h>
++		#include <linux/fs.h>
++		MODULE_LICENSE("$ZFS_META_LICENSE");
++	],[
++		struct block_device *bdev = NULL;
++		struct bio *bio = NULL;
++		bio_set_dev(bio, bdev);
++	],[
++		AC_MSG_RESULT(no)
++	],[
++		AC_MSG_RESULT(yes)
++		AC_DEFINE(HAVE_BIO_SET_DEV_GPL_ONLY, 1,
++		    [bio_set_dev() GPL-only])
++	])
++])
++
++AC_DEFUN([ZFS_AC_KERNEL_BIO_SET_DEV], [
++	ZFS_AC_KERNEL_BIO_SET_DEV_MACRO
++	ZFS_AC_KERNEL_BIO_SET_DEV_GPL_ONLY
++])
+diff --git a/module/zfs/vdev_disk.c b/module/zfs/vdev_disk.c
+index c53a0aa0fcb..db765c57bb3 100644
+--- a/module/zfs/vdev_disk.c
++++ b/module/zfs/vdev_disk.c
+@@ -513,13 +513,38 @@ vdev_submit_bio_impl(struct bio *bio)
+ #endif
+ }
+ 
+-#ifndef HAVE_BIO_SET_DEV
++#ifdef HAVE_BIO_SET_DEV
++#if defined(CONFIG_BLK_CGROUP) && defined(HAVE_BIO_SET_DEV_GPL_ONLY)
++/*
++ * The Linux 5.0 kernel updated the bio_set_dev() macro so it calls the
++ * GPL-only bio_associate_blkg() symbol thus inadvertently converting
++ * the entire macro.  Provide a minimal version which always assigns the
++ * request queue's root_blkg to the bio.
++ */
++static inline void
++vdev_bio_associate_blkg(struct bio *bio)
++{
++	struct request_queue *q = bio->bi_disk->queue;
++
++	ASSERT3P(q, !=, NULL);
++	ASSERT3P(q->root_blkg, !=, NULL);
++	ASSERT3P(bio->bi_blkg, ==, NULL);
++
++	if (blkg_tryget(q->root_blkg))
++		bio->bi_blkg = q->root_blkg;
++}
++#define	bio_associate_blkg vdev_bio_associate_blkg
++#endif
++#else
++/*
++ * Provide a bio_set_dev() helper macro for pre-Linux 4.14 kernels.
++ */
+ static inline void
+ bio_set_dev(struct bio *bio, struct block_device *bdev)
+ {
+ 	bio->bi_bdev = bdev;
+ }
+-#endif /* !HAVE_BIO_SET_DEV */
++#endif /* HAVE_BIO_SET_DEV */
+ 
+ static inline void
+ vdev_submit_bio(struct bio *bio)
================================================================

---- gitweb:

http://git.pld-linux.org/gitweb.cgi/packages/zfs.git/commitdiff/79879454102dd719ba8e436145611e92083ab2ab



More information about the pld-cvs-commit mailing list