update submodule and patches to 0.8.2
Signed-off-by: Thomas Lamprecht <t.lamprecht@proxmox.com>
This commit is contained in:
parent
33e3621234
commit
08743f90d9
@ -4,6 +4,7 @@ From: Debian ZFS on Linux maintainers
|
|||||||
Date: Wed, 30 Jan 2019 15:12:04 +0100
|
Date: Wed, 30 Jan 2019 15:12:04 +0100
|
||||||
Subject: [PATCH] Check-for-META-and-DCH-consistency-in-autoconf
|
Subject: [PATCH] Check-for-META-and-DCH-consistency-in-autoconf
|
||||||
|
|
||||||
|
Signed-off-by: Thomas Lamprecht <t.lamprecht@proxmox.com>
|
||||||
---
|
---
|
||||||
config/zfs-meta.m4 | 34 +++++++++++++++++++++++++++++-----
|
config/zfs-meta.m4 | 34 +++++++++++++++++++++++++++++-----
|
||||||
1 file changed, 29 insertions(+), 5 deletions(-)
|
1 file changed, 29 insertions(+), 5 deletions(-)
|
||||||
|
@ -13,6 +13,7 @@ not actually used.
|
|||||||
|
|
||||||
Signed-off-by: Fabian Grünbichler <f.gruenbichler@proxmox.com>
|
Signed-off-by: Fabian Grünbichler <f.gruenbichler@proxmox.com>
|
||||||
Signed-off-by: Stoiko Ivanov <s.ivanov@proxmox.com>
|
Signed-off-by: Stoiko Ivanov <s.ivanov@proxmox.com>
|
||||||
|
Signed-off-by: Thomas Lamprecht <t.lamprecht@proxmox.com>
|
||||||
---
|
---
|
||||||
etc/modules-load.d/zfs.conf.in | 2 +-
|
etc/modules-load.d/zfs.conf.in | 2 +-
|
||||||
1 file changed, 1 insertion(+), 1 deletion(-)
|
1 file changed, 1 insertion(+), 1 deletion(-)
|
||||||
|
@ -6,6 +6,8 @@ Subject: [PATCH] Fix the path to the zed binary on the systemd unit.
|
|||||||
We install zed into /usr/sbin manually meanwhile the upstream default is
|
We install zed into /usr/sbin manually meanwhile the upstream default is
|
||||||
installing it into /sbin. Ubuntu packages also install zed to /usr/sbin, but
|
installing it into /sbin. Ubuntu packages also install zed to /usr/sbin, but
|
||||||
they ship their own zfs-zed unit.
|
they ship their own zfs-zed unit.
|
||||||
|
|
||||||
|
Signed-off-by: Thomas Lamprecht <t.lamprecht@proxmox.com>
|
||||||
---
|
---
|
||||||
etc/systemd/system/zfs-zed.service.in | 2 +-
|
etc/systemd/system/zfs-zed.service.in | 2 +-
|
||||||
1 file changed, 1 insertion(+), 1 deletion(-)
|
1 file changed, 1 insertion(+), 1 deletion(-)
|
||||||
|
@ -8,6 +8,7 @@ Content-Transfer-Encoding: 8bit
|
|||||||
|
|
||||||
Signed-off-by: Fabian Grünbichler <f.gruenbichler@proxmox.com>
|
Signed-off-by: Fabian Grünbichler <f.gruenbichler@proxmox.com>
|
||||||
Signed-off-by: Stoiko Ivanov <s.ivanov@proxmox.com>
|
Signed-off-by: Stoiko Ivanov <s.ivanov@proxmox.com>
|
||||||
|
Signed-off-by: Thomas Lamprecht <t.lamprecht@proxmox.com>
|
||||||
---
|
---
|
||||||
etc/systemd/system/zfs-import-scan.service.in | 2 +-
|
etc/systemd/system/zfs-import-scan.service.in | 2 +-
|
||||||
1 file changed, 1 insertion(+), 1 deletion(-)
|
1 file changed, 1 insertion(+), 1 deletion(-)
|
@ -1,75 +0,0 @@
|
|||||||
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
|
||||||
From: Colin Ian King <colin.king@canonical.com>
|
|
||||||
Date: Tue, 31 Oct 2017 19:12:42 +0800
|
|
||||||
Subject: [PATCH] increase-default-zcmd-allocation-to-256K
|
|
||||||
|
|
||||||
Increase default zcmd allocation to 256K (LP: #567557)
|
|
||||||
|
|
||||||
When creating hundreds of clones (for example using containers with
|
|
||||||
LXD) cloning slows down as the number of clones increases over time.
|
|
||||||
The reason for this is that the fetching of the clone information
|
|
||||||
using a small zcmd buffer requires two ioctl calls, one to determine
|
|
||||||
the size and a second to return the data. However, this requires
|
|
||||||
gathering the data twice, once to determine the size and again to
|
|
||||||
populate the zcmd buffer to return it to userspace.
|
|
||||||
|
|
||||||
These are expensive ioctl() calls, so instead, make the default buffer
|
|
||||||
size much larger: 256K. This may sound large, but on 64 bit systems
|
|
||||||
running ZFS this is not a huge chunk of memory for the speed
|
|
||||||
improvement we gains for large sets of clones:
|
|
||||||
|
|
||||||
16K zcmd 256K zcmd
|
|
||||||
Clones Time Clones Time Clone % improvement
|
|
||||||
(secs) per sec (secs) per sec
|
|
||||||
100 7 14.29 5 20.00 28.57
|
|
||||||
200 10 20.00 9 22.22 10.00
|
|
||||||
300 19 15.79 18 16.67 5.26
|
|
||||||
400 22 18.18 22 18.18 0.00
|
|
||||||
500 29 17.24 29 17.24 0.00
|
|
||||||
600 39 15.38 39 15.38 0.00
|
|
||||||
700 46 15.22 45 15.56 2.17
|
|
||||||
800 58 13.79 51 15.69 12.07
|
|
||||||
900 74 12.16 61 14.75 17.57
|
|
||||||
1000 90 11.11 74 13.51 17.78
|
|
||||||
1100 98 11.22 87 12.64 11.22
|
|
||||||
1200 102 11.76 95 12.63 6.86
|
|
||||||
1300 113 11.50 104 12.50 7.96
|
|
||||||
1400 143 9.79 109 12.84 23.78
|
|
||||||
1500 145 10.34 132 11.36 8.97
|
|
||||||
1600 165 9.70 145 11.03 12.12
|
|
||||||
1700 187 9.09 156 10.90 16.58
|
|
||||||
1800 210 8.57 166 10.84 20.95
|
|
||||||
1900 226 8.41 183 10.38 19.03
|
|
||||||
2000 256 7.81 198 10.10 22.66
|
|
||||||
2200 311 7.07 238 9.24 23.47
|
|
||||||
2400 373 6.43 271 8.86 27.35
|
|
||||||
2600 487 5.34 316 8.23 35.11
|
|
||||||
3000 619 4.85 426 7.04 31.18
|
|
||||||
3400 915 3.72 549 6.19 40.00
|
|
||||||
4000 1332 3.00 923 4.33 30.71
|
|
||||||
|
|
||||||
As one can see, with > 2000 clones we get 25-40% speed
|
|
||||||
improvement.
|
|
||||||
|
|
||||||
This patch was originally suggested by Brian Behlendorf
|
|
||||||
(see https://github.com/zfsonlinux/zfs/issues/6372), however
|
|
||||||
this fix is a more generic fix to cover all zcmd cases.
|
|
||||||
|
|
||||||
Signed-off-by: Colin Ian King <colin.king@canonical.com>
|
|
||||||
---
|
|
||||||
lib/libzfs/libzfs_util.c | 2 +-
|
|
||||||
1 file changed, 1 insertion(+), 1 deletion(-)
|
|
||||||
|
|
||||||
diff --git a/lib/libzfs/libzfs_util.c b/lib/libzfs/libzfs_util.c
|
|
||||||
index 19bb57ad4..2a069ffe6 100644
|
|
||||||
--- a/lib/libzfs/libzfs_util.c
|
|
||||||
+++ b/lib/libzfs/libzfs_util.c
|
|
||||||
@@ -1134,7 +1134,7 @@ int
|
|
||||||
zcmd_alloc_dst_nvlist(libzfs_handle_t *hdl, zfs_cmd_t *zc, size_t len)
|
|
||||||
{
|
|
||||||
if (len == 0)
|
|
||||||
- len = 16 * 1024;
|
|
||||||
+ len = 256 * 1024;
|
|
||||||
zc->zc_nvlist_dst_size = len;
|
|
||||||
zc->zc_nvlist_dst =
|
|
||||||
(uint64_t)(uintptr_t)zfs_alloc(hdl, zc->zc_nvlist_dst_size);
|
|
@ -6,6 +6,8 @@ Subject: [PATCH] Enable zed emails
|
|||||||
The OpenZFS event daemon monitors pools. This patch enables the email sending
|
The OpenZFS event daemon monitors pools. This patch enables the email sending
|
||||||
function by default (if zed is installed). This is consistent with the default
|
function by default (if zed is installed). This is consistent with the default
|
||||||
behavior of mdadm.
|
behavior of mdadm.
|
||||||
|
|
||||||
|
Signed-off-by: Thomas Lamprecht <t.lamprecht@proxmox.com>
|
||||||
---
|
---
|
||||||
cmd/zed/zed.d/zed.rc | 4 ++--
|
cmd/zed/zed.d/zed.rc | 4 ++--
|
||||||
1 file changed, 2 insertions(+), 2 deletions(-)
|
1 file changed, 2 insertions(+), 2 deletions(-)
|
@ -61,20 +61,22 @@ Closes #8793
|
|||||||
Closes #8965
|
Closes #8965
|
||||||
(cherry picked from commit e5db31349484e5e859c7a942eb15b98d68ce5b4d)
|
(cherry picked from commit e5db31349484e5e859c7a942eb15b98d68ce5b4d)
|
||||||
Signed-off-by: Fabian Grünbichler <f.gruenbichler@proxmox.com>
|
Signed-off-by: Fabian Grünbichler <f.gruenbichler@proxmox.com>
|
||||||
|
Signed-off-by: Thomas Lamprecht <t.lamprecht@proxmox.com>
|
||||||
---
|
---
|
||||||
|
cmd/ztest/ztest.c | 3 +
|
||||||
|
config/kernel-fpu.m4 | 46 ++++-
|
||||||
include/linux/Makefile.am | 1 +
|
include/linux/Makefile.am | 1 +
|
||||||
include/linux/simd.h | 41 +++++
|
include/linux/simd.h | 41 +++++
|
||||||
include/linux/simd_aarch64.h | 18 +-
|
include/linux/simd_aarch64.h | 18 +-
|
||||||
include/linux/simd_x86.h | 192 +++++++++++++-------
|
include/linux/simd_x86.h | 192 +++++++++++++-------
|
||||||
include/sys/vdev_raidz.h | 2 +-
|
include/sys/vdev_raidz.h | 2 +-
|
||||||
include/sys/vdev_raidz_impl.h | 2 +-
|
include/sys/vdev_raidz_impl.h | 2 +-
|
||||||
module/icp/include/aes/aes_impl.h | 6 +-
|
|
||||||
module/icp/include/modes/gcm_impl.h | 6 +-
|
|
||||||
cmd/ztest/ztest.c | 3 +
|
|
||||||
module/icp/algs/aes/aes_impl.c | 34 ++--
|
module/icp/algs/aes/aes_impl.c | 34 ++--
|
||||||
module/icp/algs/aes/aes_impl_aesni.c | 2 +-
|
module/icp/algs/aes/aes_impl_aesni.c | 2 +-
|
||||||
module/icp/algs/modes/gcm.c | 41 +++--
|
module/icp/algs/modes/gcm.c | 41 +++--
|
||||||
module/icp/algs/modes/gcm_pclmulqdq.c | 2 +-
|
module/icp/algs/modes/gcm_pclmulqdq.c | 2 +-
|
||||||
|
module/icp/include/aes/aes_impl.h | 6 +-
|
||||||
|
module/icp/include/modes/gcm_impl.h | 6 +-
|
||||||
module/icp/io/aes.c | 32 +++-
|
module/icp/io/aes.c | 32 +++-
|
||||||
module/spl/spl-taskq.c | 2 +
|
module/spl/spl-taskq.c | 2 +
|
||||||
module/spl/spl-thread.c | 2 +
|
module/spl/spl-thread.c | 2 +
|
||||||
@ -91,10 +93,95 @@ Signed-off-by: Fabian Grünbichler <f.gruenbichler@proxmox.com>
|
|||||||
module/zfs/vdev_raidz_math_avx512f.c | 5 +-
|
module/zfs/vdev_raidz_math_avx512f.c | 5 +-
|
||||||
module/zfs/vdev_raidz_math_sse2.c | 2 +-
|
module/zfs/vdev_raidz_math_sse2.c | 2 +-
|
||||||
module/zfs/vdev_raidz_math_ssse3.c | 4 +-
|
module/zfs/vdev_raidz_math_ssse3.c | 4 +-
|
||||||
config/kernel-fpu.m4 | 46 ++++-
|
|
||||||
30 files changed, 454 insertions(+), 204 deletions(-)
|
30 files changed, 454 insertions(+), 204 deletions(-)
|
||||||
create mode 100644 include/linux/simd.h
|
create mode 100644 include/linux/simd.h
|
||||||
|
|
||||||
|
diff --git a/cmd/ztest/ztest.c b/cmd/ztest/ztest.c
|
||||||
|
index 3bf840d88..dc22faef7 100644
|
||||||
|
--- a/cmd/ztest/ztest.c
|
||||||
|
+++ b/cmd/ztest/ztest.c
|
||||||
|
@@ -107,6 +107,7 @@
|
||||||
|
#include <sys/vdev_impl.h>
|
||||||
|
#include <sys/vdev_file.h>
|
||||||
|
#include <sys/vdev_initialize.h>
|
||||||
|
+#include <sys/vdev_raidz.h>
|
||||||
|
#include <sys/vdev_trim.h>
|
||||||
|
#include <sys/spa_impl.h>
|
||||||
|
#include <sys/metaslab_impl.h>
|
||||||
|
@@ -7110,6 +7111,8 @@ ztest_run(ztest_shared_t *zs)
|
||||||
|
metaslab_preload_limit = ztest_random(20) + 1;
|
||||||
|
ztest_spa = spa;
|
||||||
|
|
||||||
|
+ VERIFY0(vdev_raidz_impl_set("cycle"));
|
||||||
|
+
|
||||||
|
dmu_objset_stats_t dds;
|
||||||
|
VERIFY0(ztest_dmu_objset_own(ztest_opts.zo_pool,
|
||||||
|
DMU_OST_ANY, B_TRUE, B_TRUE, FTAG, &os));
|
||||||
|
diff --git a/config/kernel-fpu.m4 b/config/kernel-fpu.m4
|
||||||
|
index ebb02fb09..0e622e859 100644
|
||||||
|
--- a/config/kernel-fpu.m4
|
||||||
|
+++ b/config/kernel-fpu.m4
|
||||||
|
@@ -2,8 +2,15 @@ dnl #
|
||||||
|
dnl # Handle differences in kernel FPU code.
|
||||||
|
dnl #
|
||||||
|
dnl # Kernel
|
||||||
|
-dnl # 5.0: All kernel fpu functions are GPL only, so we can't use them.
|
||||||
|
-dnl # (nothing defined)
|
||||||
|
+dnl # 5.2: The fpu->initialized flag was replaced by TIF_NEED_FPU_LOAD.
|
||||||
|
+dnl # HAVE_KERNEL_TIF_NEED_FPU_LOAD
|
||||||
|
+dnl #
|
||||||
|
+dnl # 5.0: As an optimization SIMD operations performed by kernel
|
||||||
|
+dnl # threads can skip saving and restoring their FPU context.
|
||||||
|
+dnl # Wrappers have been introduced to determine the running
|
||||||
|
+dnl # context and use either the SIMD or generic implementation.
|
||||||
|
+dnl # This change was made to the 4.19.38 and 4.14.120 LTS kernels.
|
||||||
|
+dnl # HAVE_KERNEL_FPU_INITIALIZED
|
||||||
|
dnl #
|
||||||
|
dnl # 4.2: Use __kernel_fpu_{begin,end}()
|
||||||
|
dnl # HAVE_UNDERSCORE_KERNEL_FPU & KERNEL_EXPORTS_X86_FPU
|
||||||
|
@@ -59,10 +66,39 @@ AC_DEFUN([ZFS_AC_KERNEL_FPU], [
|
||||||
|
__kernel_fpu_end();
|
||||||
|
], [__kernel_fpu_begin], [arch/x86/kernel/fpu/core.c arch/x86/kernel/i387.c], [
|
||||||
|
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_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)
|
||||||
|
+ ZFS_LINUX_TRY_COMPILE([
|
||||||
|
+ #include <linux/module.h>
|
||||||
|
+ #include <linux/sched.h>
|
||||||
|
+ ],[
|
||||||
|
+ struct fpu *fpu = ¤t->thread.fpu;
|
||||||
|
+ if (fpu->initialized) { return (0); };
|
||||||
|
+ ],[
|
||||||
|
+ AC_MSG_RESULT(fpu.initialized)
|
||||||
|
+ AC_DEFINE(HAVE_KERNEL_FPU_INITIALIZED, 1,
|
||||||
|
+ [kernel fpu.initialized exists])
|
||||||
|
+ ],[
|
||||||
|
+ ZFS_LINUX_TRY_COMPILE([
|
||||||
|
+ #include <linux/module.h>
|
||||||
|
+ #include <asm/thread_info.h>
|
||||||
|
+
|
||||||
|
+ #if !defined(TIF_NEED_FPU_LOAD)
|
||||||
|
+ #error "TIF_NEED_FPU_LOAD undefined"
|
||||||
|
+ #endif
|
||||||
|
+ ],[
|
||||||
|
+ ],[
|
||||||
|
+ AC_MSG_RESULT(TIF_NEED_FPU_LOAD)
|
||||||
|
+ AC_DEFINE(
|
||||||
|
+ HAVE_KERNEL_TIF_NEED_FPU_LOAD, 1,
|
||||||
|
+ [kernel TIF_NEED_FPU_LOAD exists])
|
||||||
|
+ ],[
|
||||||
|
+ AC_MSG_RESULT(unavailable)
|
||||||
|
+ ])
|
||||||
|
+ ])
|
||||||
|
])
|
||||||
|
])
|
||||||
|
])
|
||||||
diff --git a/include/linux/Makefile.am b/include/linux/Makefile.am
|
diff --git a/include/linux/Makefile.am b/include/linux/Makefile.am
|
||||||
index efb49520e..2455759e8 100644
|
index efb49520e..2455759e8 100644
|
||||||
--- a/include/linux/Makefile.am
|
--- a/include/linux/Makefile.am
|
||||||
@ -155,10 +242,10 @@ index 000000000..d2b60996a
|
|||||||
+#endif
|
+#endif
|
||||||
+#endif /* _SIMD_H */
|
+#endif /* _SIMD_H */
|
||||||
diff --git a/include/linux/simd_aarch64.h b/include/linux/simd_aarch64.h
|
diff --git a/include/linux/simd_aarch64.h b/include/linux/simd_aarch64.h
|
||||||
index 155ef6205..1cfcd01e4 100644
|
index 56153a160..b45d31c48 100644
|
||||||
--- a/include/linux/simd_aarch64.h
|
--- a/include/linux/simd_aarch64.h
|
||||||
+++ b/include/linux/simd_aarch64.h
|
+++ b/include/linux/simd_aarch64.h
|
||||||
@@ -41,20 +41,18 @@
|
@@ -43,20 +43,18 @@
|
||||||
|
|
||||||
#if defined(_KERNEL)
|
#if defined(_KERNEL)
|
||||||
#include <asm/neon.h>
|
#include <asm/neon.h>
|
||||||
@ -188,10 +275,10 @@ index 155ef6205..1cfcd01e4 100644
|
|||||||
|
|
||||||
#endif /* __aarch64__ */
|
#endif /* __aarch64__ */
|
||||||
diff --git a/include/linux/simd_x86.h b/include/linux/simd_x86.h
|
diff --git a/include/linux/simd_x86.h b/include/linux/simd_x86.h
|
||||||
index 12cd74677..2d7a1c3a5 100644
|
index 0489bfaa3..641f43955 100644
|
||||||
--- a/include/linux/simd_x86.h
|
--- a/include/linux/simd_x86.h
|
||||||
+++ b/include/linux/simd_x86.h
|
+++ b/include/linux/simd_x86.h
|
||||||
@@ -90,33 +90,135 @@
|
@@ -92,33 +92,135 @@
|
||||||
#include <asm/xcr.h>
|
#include <asm/xcr.h>
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
@ -342,7 +429,7 @@ index 12cd74677..2d7a1c3a5 100644
|
|||||||
#endif /* defined(_KERNEL) */
|
#endif /* defined(_KERNEL) */
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@@ -298,7 +400,7 @@ __simd_state_enabled(const uint64_t state)
|
@@ -300,7 +402,7 @@ __simd_state_enabled(const uint64_t state)
|
||||||
uint64_t xcr0;
|
uint64_t xcr0;
|
||||||
|
|
||||||
#if defined(_KERNEL)
|
#if defined(_KERNEL)
|
||||||
@ -351,7 +438,7 @@ index 12cd74677..2d7a1c3a5 100644
|
|||||||
has_osxsave = !!boot_cpu_has(X86_FEATURE_OSXSAVE);
|
has_osxsave = !!boot_cpu_has(X86_FEATURE_OSXSAVE);
|
||||||
#else
|
#else
|
||||||
has_osxsave = B_FALSE;
|
has_osxsave = B_FALSE;
|
||||||
@@ -328,11 +430,7 @@ static inline boolean_t
|
@@ -330,11 +432,7 @@ static inline boolean_t
|
||||||
zfs_sse_available(void)
|
zfs_sse_available(void)
|
||||||
{
|
{
|
||||||
#if defined(_KERNEL)
|
#if defined(_KERNEL)
|
||||||
@ -363,7 +450,7 @@ index 12cd74677..2d7a1c3a5 100644
|
|||||||
#elif !defined(_KERNEL)
|
#elif !defined(_KERNEL)
|
||||||
return (__cpuid_has_sse());
|
return (__cpuid_has_sse());
|
||||||
#endif
|
#endif
|
||||||
@@ -345,11 +443,7 @@ static inline boolean_t
|
@@ -347,11 +445,7 @@ static inline boolean_t
|
||||||
zfs_sse2_available(void)
|
zfs_sse2_available(void)
|
||||||
{
|
{
|
||||||
#if defined(_KERNEL)
|
#if defined(_KERNEL)
|
||||||
@ -375,7 +462,7 @@ index 12cd74677..2d7a1c3a5 100644
|
|||||||
#elif !defined(_KERNEL)
|
#elif !defined(_KERNEL)
|
||||||
return (__cpuid_has_sse2());
|
return (__cpuid_has_sse2());
|
||||||
#endif
|
#endif
|
||||||
@@ -362,11 +456,7 @@ static inline boolean_t
|
@@ -364,11 +458,7 @@ static inline boolean_t
|
||||||
zfs_sse3_available(void)
|
zfs_sse3_available(void)
|
||||||
{
|
{
|
||||||
#if defined(_KERNEL)
|
#if defined(_KERNEL)
|
||||||
@ -387,7 +474,7 @@ index 12cd74677..2d7a1c3a5 100644
|
|||||||
#elif !defined(_KERNEL)
|
#elif !defined(_KERNEL)
|
||||||
return (__cpuid_has_sse3());
|
return (__cpuid_has_sse3());
|
||||||
#endif
|
#endif
|
||||||
@@ -379,11 +469,7 @@ static inline boolean_t
|
@@ -381,11 +471,7 @@ static inline boolean_t
|
||||||
zfs_ssse3_available(void)
|
zfs_ssse3_available(void)
|
||||||
{
|
{
|
||||||
#if defined(_KERNEL)
|
#if defined(_KERNEL)
|
||||||
@ -399,7 +486,7 @@ index 12cd74677..2d7a1c3a5 100644
|
|||||||
#elif !defined(_KERNEL)
|
#elif !defined(_KERNEL)
|
||||||
return (__cpuid_has_ssse3());
|
return (__cpuid_has_ssse3());
|
||||||
#endif
|
#endif
|
||||||
@@ -396,11 +482,7 @@ static inline boolean_t
|
@@ -398,11 +484,7 @@ static inline boolean_t
|
||||||
zfs_sse4_1_available(void)
|
zfs_sse4_1_available(void)
|
||||||
{
|
{
|
||||||
#if defined(_KERNEL)
|
#if defined(_KERNEL)
|
||||||
@ -411,7 +498,7 @@ index 12cd74677..2d7a1c3a5 100644
|
|||||||
#elif !defined(_KERNEL)
|
#elif !defined(_KERNEL)
|
||||||
return (__cpuid_has_sse4_1());
|
return (__cpuid_has_sse4_1());
|
||||||
#endif
|
#endif
|
||||||
@@ -413,11 +495,7 @@ static inline boolean_t
|
@@ -415,11 +497,7 @@ static inline boolean_t
|
||||||
zfs_sse4_2_available(void)
|
zfs_sse4_2_available(void)
|
||||||
{
|
{
|
||||||
#if defined(_KERNEL)
|
#if defined(_KERNEL)
|
||||||
@ -423,7 +510,7 @@ index 12cd74677..2d7a1c3a5 100644
|
|||||||
#elif !defined(_KERNEL)
|
#elif !defined(_KERNEL)
|
||||||
return (__cpuid_has_sse4_2());
|
return (__cpuid_has_sse4_2());
|
||||||
#endif
|
#endif
|
||||||
@@ -431,11 +509,7 @@ zfs_avx_available(void)
|
@@ -433,11 +511,7 @@ zfs_avx_available(void)
|
||||||
{
|
{
|
||||||
boolean_t has_avx;
|
boolean_t has_avx;
|
||||||
#if defined(_KERNEL)
|
#if defined(_KERNEL)
|
||||||
@ -435,7 +522,7 @@ index 12cd74677..2d7a1c3a5 100644
|
|||||||
#elif !defined(_KERNEL)
|
#elif !defined(_KERNEL)
|
||||||
has_avx = __cpuid_has_avx();
|
has_avx = __cpuid_has_avx();
|
||||||
#endif
|
#endif
|
||||||
@@ -451,11 +525,7 @@ zfs_avx2_available(void)
|
@@ -453,11 +527,7 @@ zfs_avx2_available(void)
|
||||||
{
|
{
|
||||||
boolean_t has_avx2;
|
boolean_t has_avx2;
|
||||||
#if defined(_KERNEL)
|
#if defined(_KERNEL)
|
||||||
@ -447,7 +534,7 @@ index 12cd74677..2d7a1c3a5 100644
|
|||||||
#elif !defined(_KERNEL)
|
#elif !defined(_KERNEL)
|
||||||
has_avx2 = __cpuid_has_avx2();
|
has_avx2 = __cpuid_has_avx2();
|
||||||
#endif
|
#endif
|
||||||
@@ -470,7 +540,7 @@ static inline boolean_t
|
@@ -472,7 +542,7 @@ static inline boolean_t
|
||||||
zfs_bmi1_available(void)
|
zfs_bmi1_available(void)
|
||||||
{
|
{
|
||||||
#if defined(_KERNEL)
|
#if defined(_KERNEL)
|
||||||
@ -456,7 +543,7 @@ index 12cd74677..2d7a1c3a5 100644
|
|||||||
return (!!boot_cpu_has(X86_FEATURE_BMI1));
|
return (!!boot_cpu_has(X86_FEATURE_BMI1));
|
||||||
#else
|
#else
|
||||||
return (B_FALSE);
|
return (B_FALSE);
|
||||||
@@ -487,7 +557,7 @@ static inline boolean_t
|
@@ -489,7 +559,7 @@ static inline boolean_t
|
||||||
zfs_bmi2_available(void)
|
zfs_bmi2_available(void)
|
||||||
{
|
{
|
||||||
#if defined(_KERNEL)
|
#if defined(_KERNEL)
|
||||||
@ -465,7 +552,7 @@ index 12cd74677..2d7a1c3a5 100644
|
|||||||
return (!!boot_cpu_has(X86_FEATURE_BMI2));
|
return (!!boot_cpu_has(X86_FEATURE_BMI2));
|
||||||
#else
|
#else
|
||||||
return (B_FALSE);
|
return (B_FALSE);
|
||||||
@@ -504,7 +574,7 @@ static inline boolean_t
|
@@ -506,7 +576,7 @@ static inline boolean_t
|
||||||
zfs_aes_available(void)
|
zfs_aes_available(void)
|
||||||
{
|
{
|
||||||
#if defined(_KERNEL)
|
#if defined(_KERNEL)
|
||||||
@ -474,7 +561,7 @@ index 12cd74677..2d7a1c3a5 100644
|
|||||||
return (!!boot_cpu_has(X86_FEATURE_AES));
|
return (!!boot_cpu_has(X86_FEATURE_AES));
|
||||||
#else
|
#else
|
||||||
return (B_FALSE);
|
return (B_FALSE);
|
||||||
@@ -521,7 +591,7 @@ static inline boolean_t
|
@@ -523,7 +593,7 @@ static inline boolean_t
|
||||||
zfs_pclmulqdq_available(void)
|
zfs_pclmulqdq_available(void)
|
||||||
{
|
{
|
||||||
#if defined(_KERNEL)
|
#if defined(_KERNEL)
|
||||||
@ -483,7 +570,7 @@ index 12cd74677..2d7a1c3a5 100644
|
|||||||
return (!!boot_cpu_has(X86_FEATURE_PCLMULQDQ));
|
return (!!boot_cpu_has(X86_FEATURE_PCLMULQDQ));
|
||||||
#else
|
#else
|
||||||
return (B_FALSE);
|
return (B_FALSE);
|
||||||
@@ -555,7 +625,7 @@ zfs_avx512f_available(void)
|
@@ -557,7 +627,7 @@ zfs_avx512f_available(void)
|
||||||
boolean_t has_avx512 = B_FALSE;
|
boolean_t has_avx512 = B_FALSE;
|
||||||
|
|
||||||
#if defined(_KERNEL)
|
#if defined(_KERNEL)
|
||||||
@ -492,7 +579,7 @@ index 12cd74677..2d7a1c3a5 100644
|
|||||||
has_avx512 = !!boot_cpu_has(X86_FEATURE_AVX512F);
|
has_avx512 = !!boot_cpu_has(X86_FEATURE_AVX512F);
|
||||||
#else
|
#else
|
||||||
has_avx512 = B_FALSE;
|
has_avx512 = B_FALSE;
|
||||||
@@ -574,7 +644,7 @@ zfs_avx512cd_available(void)
|
@@ -576,7 +646,7 @@ zfs_avx512cd_available(void)
|
||||||
boolean_t has_avx512 = B_FALSE;
|
boolean_t has_avx512 = B_FALSE;
|
||||||
|
|
||||||
#if defined(_KERNEL)
|
#if defined(_KERNEL)
|
||||||
@ -501,7 +588,7 @@ index 12cd74677..2d7a1c3a5 100644
|
|||||||
has_avx512 = boot_cpu_has(X86_FEATURE_AVX512F) &&
|
has_avx512 = boot_cpu_has(X86_FEATURE_AVX512F) &&
|
||||||
boot_cpu_has(X86_FEATURE_AVX512CD);
|
boot_cpu_has(X86_FEATURE_AVX512CD);
|
||||||
#else
|
#else
|
||||||
@@ -594,7 +664,7 @@ zfs_avx512er_available(void)
|
@@ -596,7 +666,7 @@ zfs_avx512er_available(void)
|
||||||
boolean_t has_avx512 = B_FALSE;
|
boolean_t has_avx512 = B_FALSE;
|
||||||
|
|
||||||
#if defined(_KERNEL)
|
#if defined(_KERNEL)
|
||||||
@ -510,7 +597,7 @@ index 12cd74677..2d7a1c3a5 100644
|
|||||||
has_avx512 = boot_cpu_has(X86_FEATURE_AVX512F) &&
|
has_avx512 = boot_cpu_has(X86_FEATURE_AVX512F) &&
|
||||||
boot_cpu_has(X86_FEATURE_AVX512ER);
|
boot_cpu_has(X86_FEATURE_AVX512ER);
|
||||||
#else
|
#else
|
||||||
@@ -614,7 +684,7 @@ zfs_avx512pf_available(void)
|
@@ -616,7 +686,7 @@ zfs_avx512pf_available(void)
|
||||||
boolean_t has_avx512 = B_FALSE;
|
boolean_t has_avx512 = B_FALSE;
|
||||||
|
|
||||||
#if defined(_KERNEL)
|
#if defined(_KERNEL)
|
||||||
@ -519,7 +606,7 @@ index 12cd74677..2d7a1c3a5 100644
|
|||||||
has_avx512 = boot_cpu_has(X86_FEATURE_AVX512F) &&
|
has_avx512 = boot_cpu_has(X86_FEATURE_AVX512F) &&
|
||||||
boot_cpu_has(X86_FEATURE_AVX512PF);
|
boot_cpu_has(X86_FEATURE_AVX512PF);
|
||||||
#else
|
#else
|
||||||
@@ -634,7 +704,7 @@ zfs_avx512bw_available(void)
|
@@ -636,7 +706,7 @@ zfs_avx512bw_available(void)
|
||||||
boolean_t has_avx512 = B_FALSE;
|
boolean_t has_avx512 = B_FALSE;
|
||||||
|
|
||||||
#if defined(_KERNEL)
|
#if defined(_KERNEL)
|
||||||
@ -528,7 +615,7 @@ index 12cd74677..2d7a1c3a5 100644
|
|||||||
has_avx512 = boot_cpu_has(X86_FEATURE_AVX512F) &&
|
has_avx512 = boot_cpu_has(X86_FEATURE_AVX512F) &&
|
||||||
boot_cpu_has(X86_FEATURE_AVX512BW);
|
boot_cpu_has(X86_FEATURE_AVX512BW);
|
||||||
#else
|
#else
|
||||||
@@ -654,7 +724,7 @@ zfs_avx512dq_available(void)
|
@@ -656,7 +726,7 @@ zfs_avx512dq_available(void)
|
||||||
boolean_t has_avx512 = B_FALSE;
|
boolean_t has_avx512 = B_FALSE;
|
||||||
|
|
||||||
#if defined(_KERNEL)
|
#if defined(_KERNEL)
|
||||||
@ -537,7 +624,7 @@ index 12cd74677..2d7a1c3a5 100644
|
|||||||
has_avx512 = boot_cpu_has(X86_FEATURE_AVX512F) &&
|
has_avx512 = boot_cpu_has(X86_FEATURE_AVX512F) &&
|
||||||
boot_cpu_has(X86_FEATURE_AVX512DQ);
|
boot_cpu_has(X86_FEATURE_AVX512DQ);
|
||||||
#else
|
#else
|
||||||
@@ -674,7 +744,7 @@ zfs_avx512vl_available(void)
|
@@ -676,7 +746,7 @@ zfs_avx512vl_available(void)
|
||||||
boolean_t has_avx512 = B_FALSE;
|
boolean_t has_avx512 = B_FALSE;
|
||||||
|
|
||||||
#if defined(_KERNEL)
|
#if defined(_KERNEL)
|
||||||
@ -546,7 +633,7 @@ index 12cd74677..2d7a1c3a5 100644
|
|||||||
has_avx512 = boot_cpu_has(X86_FEATURE_AVX512F) &&
|
has_avx512 = boot_cpu_has(X86_FEATURE_AVX512F) &&
|
||||||
boot_cpu_has(X86_FEATURE_AVX512VL);
|
boot_cpu_has(X86_FEATURE_AVX512VL);
|
||||||
#else
|
#else
|
||||||
@@ -694,7 +764,7 @@ zfs_avx512ifma_available(void)
|
@@ -696,7 +766,7 @@ zfs_avx512ifma_available(void)
|
||||||
boolean_t has_avx512 = B_FALSE;
|
boolean_t has_avx512 = B_FALSE;
|
||||||
|
|
||||||
#if defined(_KERNEL)
|
#if defined(_KERNEL)
|
||||||
@ -555,7 +642,7 @@ index 12cd74677..2d7a1c3a5 100644
|
|||||||
has_avx512 = boot_cpu_has(X86_FEATURE_AVX512F) &&
|
has_avx512 = boot_cpu_has(X86_FEATURE_AVX512F) &&
|
||||||
boot_cpu_has(X86_FEATURE_AVX512IFMA);
|
boot_cpu_has(X86_FEATURE_AVX512IFMA);
|
||||||
#else
|
#else
|
||||||
@@ -714,7 +784,7 @@ zfs_avx512vbmi_available(void)
|
@@ -716,7 +786,7 @@ zfs_avx512vbmi_available(void)
|
||||||
boolean_t has_avx512 = B_FALSE;
|
boolean_t has_avx512 = B_FALSE;
|
||||||
|
|
||||||
#if defined(_KERNEL)
|
#if defined(_KERNEL)
|
||||||
@ -590,69 +677,8 @@ index 0799ed19d..4969d110b 100644
|
|||||||
raidz_col_t rm_col[1]; /* Flexible array of I/O columns */
|
raidz_col_t rm_col[1]; /* Flexible array of I/O columns */
|
||||||
} raidz_map_t;
|
} raidz_map_t;
|
||||||
|
|
||||||
diff --git a/module/icp/include/aes/aes_impl.h b/module/icp/include/aes/aes_impl.h
|
|
||||||
index 95cfddf9e..9fd9c1bd1 100644
|
|
||||||
--- a/module/icp/include/aes/aes_impl.h
|
|
||||||
+++ b/module/icp/include/aes/aes_impl.h
|
|
||||||
@@ -198,12 +198,12 @@ extern const aes_impl_ops_t aes_aesni_impl;
|
|
||||||
/*
|
|
||||||
* Initializes fastest implementation
|
|
||||||
*/
|
|
||||||
-void aes_impl_init(void);
|
|
||||||
+void aes_impl_init(void *arg);
|
|
||||||
|
|
||||||
/*
|
|
||||||
- * Get selected aes implementation
|
|
||||||
+ * Returns optimal allowed AES implementation
|
|
||||||
*/
|
|
||||||
-struct aes_impl_ops *aes_impl_get_ops(void);
|
|
||||||
+const struct aes_impl_ops *aes_impl_get_ops(void);
|
|
||||||
|
|
||||||
#ifdef __cplusplus
|
|
||||||
}
|
|
||||||
diff --git a/module/icp/include/modes/gcm_impl.h b/module/icp/include/modes/gcm_impl.h
|
|
||||||
index cbb904c05..138090487 100644
|
|
||||||
--- a/module/icp/include/modes/gcm_impl.h
|
|
||||||
+++ b/module/icp/include/modes/gcm_impl.h
|
|
||||||
@@ -61,12 +61,12 @@ extern const gcm_impl_ops_t gcm_pclmulqdq_impl;
|
|
||||||
/*
|
|
||||||
* Initializes fastest implementation
|
|
||||||
*/
|
|
||||||
-void gcm_impl_init(void);
|
|
||||||
+void gcm_impl_init(void *arg);
|
|
||||||
|
|
||||||
/*
|
|
||||||
- * Get selected aes implementation
|
|
||||||
+ * Returns optimal allowed GCM implementation
|
|
||||||
*/
|
|
||||||
-struct gcm_impl_ops *gcm_impl_get_ops(void);
|
|
||||||
+const struct gcm_impl_ops *gcm_impl_get_ops(void);
|
|
||||||
|
|
||||||
#ifdef __cplusplus
|
|
||||||
}
|
|
||||||
diff --git a/cmd/ztest/ztest.c b/cmd/ztest/ztest.c
|
|
||||||
index 9c2cf9501..815462443 100644
|
|
||||||
--- a/cmd/ztest/ztest.c
|
|
||||||
+++ b/cmd/ztest/ztest.c
|
|
||||||
@@ -107,6 +107,7 @@
|
|
||||||
#include <sys/vdev_impl.h>
|
|
||||||
#include <sys/vdev_file.h>
|
|
||||||
#include <sys/vdev_initialize.h>
|
|
||||||
+#include <sys/vdev_raidz.h>
|
|
||||||
#include <sys/vdev_trim.h>
|
|
||||||
#include <sys/spa_impl.h>
|
|
||||||
#include <sys/metaslab_impl.h>
|
|
||||||
@@ -7094,6 +7095,8 @@ ztest_run(ztest_shared_t *zs)
|
|
||||||
metaslab_preload_limit = ztest_random(20) + 1;
|
|
||||||
ztest_spa = spa;
|
|
||||||
|
|
||||||
+ VERIFY0(vdev_raidz_impl_set("cycle"));
|
|
||||||
+
|
|
||||||
dmu_objset_stats_t dds;
|
|
||||||
VERIFY0(ztest_dmu_objset_own(ztest_opts.zo_pool,
|
|
||||||
DMU_OST_ANY, B_TRUE, B_TRUE, FTAG, &os));
|
|
||||||
diff --git a/module/icp/algs/aes/aes_impl.c b/module/icp/algs/aes/aes_impl.c
|
diff --git a/module/icp/algs/aes/aes_impl.c b/module/icp/algs/aes/aes_impl.c
|
||||||
index e15050635..457b9e45c 100644
|
index 36e0686a5..0f11f9999 100644
|
||||||
--- a/module/icp/algs/aes/aes_impl.c
|
--- a/module/icp/algs/aes/aes_impl.c
|
||||||
+++ b/module/icp/algs/aes/aes_impl.c
|
+++ b/module/icp/algs/aes/aes_impl.c
|
||||||
@@ -27,6 +27,7 @@
|
@@ -27,6 +27,7 @@
|
||||||
@ -750,7 +776,7 @@ index 97f7c3a47..222c176aa 100644
|
|||||||
|
|
||||||
const aes_impl_ops_t aes_aesni_impl = {
|
const aes_impl_ops_t aes_aesni_impl = {
|
||||||
diff --git a/module/icp/algs/modes/gcm.c b/module/icp/algs/modes/gcm.c
|
diff --git a/module/icp/algs/modes/gcm.c b/module/icp/algs/modes/gcm.c
|
||||||
index 13bceef0f..f6f8434de 100644
|
index 0afd957f0..423b70e2c 100644
|
||||||
--- a/module/icp/algs/modes/gcm.c
|
--- a/module/icp/algs/modes/gcm.c
|
||||||
+++ b/module/icp/algs/modes/gcm.c
|
+++ b/module/icp/algs/modes/gcm.c
|
||||||
@@ -29,6 +29,7 @@
|
@@ -29,6 +29,7 @@
|
||||||
@ -875,7 +901,7 @@ index 13bceef0f..f6f8434de 100644
|
|||||||
+ * hardware accelerated version is the fastest.
|
+ * hardware accelerated version is the fastest.
|
||||||
+ */
|
+ */
|
||||||
#if defined(__x86_64) && defined(HAVE_PCLMULQDQ)
|
#if defined(__x86_64) && defined(HAVE_PCLMULQDQ)
|
||||||
if (gcm_pclmulqdq_impl.is_supported())
|
if (gcm_pclmulqdq_impl.is_supported()) {
|
||||||
memcpy(&gcm_fastest_impl, &gcm_pclmulqdq_impl,
|
memcpy(&gcm_fastest_impl, &gcm_pclmulqdq_impl,
|
||||||
diff --git a/module/icp/algs/modes/gcm_pclmulqdq.c b/module/icp/algs/modes/gcm_pclmulqdq.c
|
diff --git a/module/icp/algs/modes/gcm_pclmulqdq.c b/module/icp/algs/modes/gcm_pclmulqdq.c
|
||||||
index be00ba37b..8a43ba33a 100644
|
index be00ba37b..8a43ba33a 100644
|
||||||
@ -890,6 +916,46 @@ index be00ba37b..8a43ba33a 100644
|
|||||||
}
|
}
|
||||||
|
|
||||||
const gcm_impl_ops_t gcm_pclmulqdq_impl = {
|
const gcm_impl_ops_t gcm_pclmulqdq_impl = {
|
||||||
|
diff --git a/module/icp/include/aes/aes_impl.h b/module/icp/include/aes/aes_impl.h
|
||||||
|
index 3a3de91cf..329e32a8e 100644
|
||||||
|
--- a/module/icp/include/aes/aes_impl.h
|
||||||
|
+++ b/module/icp/include/aes/aes_impl.h
|
||||||
|
@@ -198,12 +198,12 @@ extern const aes_impl_ops_t aes_aesni_impl;
|
||||||
|
/*
|
||||||
|
* Initializes fastest implementation
|
||||||
|
*/
|
||||||
|
-void aes_impl_init(void);
|
||||||
|
+void aes_impl_init(void *arg);
|
||||||
|
|
||||||
|
/*
|
||||||
|
- * Get selected aes implementation
|
||||||
|
+ * Returns optimal allowed AES implementation
|
||||||
|
*/
|
||||||
|
-struct aes_impl_ops *aes_impl_get_ops(void);
|
||||||
|
+const struct aes_impl_ops *aes_impl_get_ops(void);
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
}
|
||||||
|
diff --git a/module/icp/include/modes/gcm_impl.h b/module/icp/include/modes/gcm_impl.h
|
||||||
|
index b78cc8aab..dff372ef8 100644
|
||||||
|
--- a/module/icp/include/modes/gcm_impl.h
|
||||||
|
+++ b/module/icp/include/modes/gcm_impl.h
|
||||||
|
@@ -61,12 +61,12 @@ extern const gcm_impl_ops_t gcm_pclmulqdq_impl;
|
||||||
|
/*
|
||||||
|
* Initializes fastest implementation
|
||||||
|
*/
|
||||||
|
-void gcm_impl_init(void);
|
||||||
|
+void gcm_impl_init(void *arg);
|
||||||
|
|
||||||
|
/*
|
||||||
|
- * Get selected aes implementation
|
||||||
|
+ * Returns optimal allowed GCM implementation
|
||||||
|
*/
|
||||||
|
-struct gcm_impl_ops *gcm_impl_get_ops(void);
|
||||||
|
+const struct gcm_impl_ops *gcm_impl_get_ops(void);
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
}
|
||||||
diff --git a/module/icp/io/aes.c b/module/icp/io/aes.c
|
diff --git a/module/icp/io/aes.c b/module/icp/io/aes.c
|
||||||
index 53b193693..51538bc60 100644
|
index 53b193693..51538bc60 100644
|
||||||
--- a/module/icp/io/aes.c
|
--- a/module/icp/io/aes.c
|
||||||
@ -934,10 +1000,10 @@ index 53b193693..51538bc60 100644
|
|||||||
if ((ret = mod_install(&modlinkage)) != 0)
|
if ((ret = mod_install(&modlinkage)) != 0)
|
||||||
return (ret);
|
return (ret);
|
||||||
diff --git a/module/spl/spl-taskq.c b/module/spl/spl-taskq.c
|
diff --git a/module/spl/spl-taskq.c b/module/spl/spl-taskq.c
|
||||||
index 7684257be..de0e45190 100644
|
index a39f94e4c..69d591ff7 100644
|
||||||
--- a/module/spl/spl-taskq.c
|
--- a/module/spl/spl-taskq.c
|
||||||
+++ b/module/spl/spl-taskq.c
|
+++ b/module/spl/spl-taskq.c
|
||||||
@@ -27,6 +27,7 @@
|
@@ -28,6 +28,7 @@
|
||||||
#include <sys/taskq.h>
|
#include <sys/taskq.h>
|
||||||
#include <sys/kmem.h>
|
#include <sys/kmem.h>
|
||||||
#include <sys/tsd.h>
|
#include <sys/tsd.h>
|
||||||
@ -945,7 +1011,7 @@ index 7684257be..de0e45190 100644
|
|||||||
|
|
||||||
int spl_taskq_thread_bind = 0;
|
int spl_taskq_thread_bind = 0;
|
||||||
module_param(spl_taskq_thread_bind, int, 0644);
|
module_param(spl_taskq_thread_bind, int, 0644);
|
||||||
@@ -869,6 +870,7 @@ taskq_thread(void *args)
|
@@ -853,6 +854,7 @@ taskq_thread(void *args)
|
||||||
sigfillset(&blocked);
|
sigfillset(&blocked);
|
||||||
sigprocmask(SIG_BLOCK, &blocked, NULL);
|
sigprocmask(SIG_BLOCK, &blocked, NULL);
|
||||||
flush_signals(current);
|
flush_signals(current);
|
||||||
@ -954,7 +1020,7 @@ index 7684257be..de0e45190 100644
|
|||||||
tsd_set(taskq_tsd, tq);
|
tsd_set(taskq_tsd, tq);
|
||||||
spin_lock_irqsave_nested(&tq->tq_lock, flags, tq->tq_lock_class);
|
spin_lock_irqsave_nested(&tq->tq_lock, flags, tq->tq_lock_class);
|
||||||
diff --git a/module/spl/spl-thread.c b/module/spl/spl-thread.c
|
diff --git a/module/spl/spl-thread.c b/module/spl/spl-thread.c
|
||||||
index d441ad65f..c4977bcf2 100644
|
index 0352a31ea..07e3a1bff 100644
|
||||||
--- a/module/spl/spl-thread.c
|
--- a/module/spl/spl-thread.c
|
||||||
+++ b/module/spl/spl-thread.c
|
+++ b/module/spl/spl-thread.c
|
||||||
@@ -27,6 +27,7 @@
|
@@ -27,6 +27,7 @@
|
||||||
@ -974,7 +1040,7 @@ index d441ad65f..c4977bcf2 100644
|
|||||||
kmem_free(tp, sizeof (thread_priv_t));
|
kmem_free(tp, sizeof (thread_priv_t));
|
||||||
|
|
||||||
diff --git a/module/zcommon/zfs_fletcher.c b/module/zcommon/zfs_fletcher.c
|
diff --git a/module/zcommon/zfs_fletcher.c b/module/zcommon/zfs_fletcher.c
|
||||||
index 5a991ba60..b75d8ab00 100644
|
index f712ce40c..9187a7c1e 100644
|
||||||
--- a/module/zcommon/zfs_fletcher.c
|
--- a/module/zcommon/zfs_fletcher.c
|
||||||
+++ b/module/zcommon/zfs_fletcher.c
|
+++ b/module/zcommon/zfs_fletcher.c
|
||||||
@@ -140,6 +140,7 @@
|
@@ -140,6 +140,7 @@
|
||||||
@ -1054,7 +1120,7 @@ index 5a991ba60..b75d8ab00 100644
|
|||||||
ops = fletcher_4_supp_impls[impl];
|
ops = fletcher_4_supp_impls[impl];
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
@@ -658,6 +661,7 @@ fletcher_4_kstat_addr(kstat_t *ksp, loff_t n)
|
@@ -659,6 +662,7 @@ fletcher_4_kstat_addr(kstat_t *ksp, loff_t n)
|
||||||
typedef void fletcher_checksum_func_t(const void *, uint64_t, const void *,
|
typedef void fletcher_checksum_func_t(const void *, uint64_t, const void *,
|
||||||
zio_cksum_t *);
|
zio_cksum_t *);
|
||||||
|
|
||||||
@ -1221,7 +1287,7 @@ index a0b42e5f5..e6389d6e5 100644
|
|||||||
|
|
||||||
const fletcher_4_ops_t fletcher_4_ssse3_ops = {
|
const fletcher_4_ops_t fletcher_4_ssse3_ops = {
|
||||||
diff --git a/module/zfs/vdev_raidz_math.c b/module/zfs/vdev_raidz_math.c
|
diff --git a/module/zfs/vdev_raidz_math.c b/module/zfs/vdev_raidz_math.c
|
||||||
index e6112bc02..e7a39015c 100644
|
index 3ef67768f..ef514e9e1 100644
|
||||||
--- a/module/zfs/vdev_raidz_math.c
|
--- a/module/zfs/vdev_raidz_math.c
|
||||||
+++ b/module/zfs/vdev_raidz_math.c
|
+++ b/module/zfs/vdev_raidz_math.c
|
||||||
@@ -27,9 +27,9 @@
|
@@ -27,9 +27,9 @@
|
||||||
@ -1348,7 +1414,7 @@ index e6112bc02..e7a39015c 100644
|
|||||||
+ raidz_map_t *bench_rm = NULL;
|
+ raidz_map_t *bench_rm = NULL;
|
||||||
+ uint64_t bench_parity;
|
+ uint64_t bench_parity;
|
||||||
|
|
||||||
/* Fake an zio and run the benchmark on a warmed up buffer */
|
/* Fake a zio and run the benchmark on a warmed up buffer */
|
||||||
bench_zio = kmem_zalloc(sizeof (zio_t), KM_SLEEP);
|
bench_zio = kmem_zalloc(sizeof (zio_t), KM_SLEEP);
|
||||||
@@ -480,7 +476,7 @@ vdev_raidz_math_init(void)
|
@@ -480,7 +476,7 @@ vdev_raidz_math_init(void)
|
||||||
memset(abd_to_buf(bench_zio->io_abd), 0xAA, BENCH_ZIO_SIZE);
|
memset(abd_to_buf(bench_zio->io_abd), 0xAA, BENCH_ZIO_SIZE);
|
||||||
@ -1548,68 +1614,3 @@ index 047a48d54..62247cf8e 100644
|
|||||||
}
|
}
|
||||||
|
|
||||||
const raidz_impl_ops_t vdev_raidz_ssse3_impl = {
|
const raidz_impl_ops_t vdev_raidz_ssse3_impl = {
|
||||||
diff --git a/config/kernel-fpu.m4 b/config/kernel-fpu.m4
|
|
||||||
index 5fff79a74..31bf35f83 100644
|
|
||||||
--- a/config/kernel-fpu.m4
|
|
||||||
+++ b/config/kernel-fpu.m4
|
|
||||||
@@ -2,8 +2,15 @@ dnl #
|
|
||||||
dnl # Handle differences in kernel FPU code.
|
|
||||||
dnl #
|
|
||||||
dnl # Kernel
|
|
||||||
-dnl # 5.0: All kernel fpu functions are GPL only, so we can't use them.
|
|
||||||
-dnl # (nothing defined)
|
|
||||||
+dnl # 5.2: The fpu->initialized flag was replaced by TIF_NEED_FPU_LOAD.
|
|
||||||
+dnl # HAVE_KERNEL_TIF_NEED_FPU_LOAD
|
|
||||||
+dnl #
|
|
||||||
+dnl # 5.0: As an optimization SIMD operations performed by kernel
|
|
||||||
+dnl # threads can skip saving and restoring their FPU context.
|
|
||||||
+dnl # Wrappers have been introduced to determine the running
|
|
||||||
+dnl # context and use either the SIMD or generic implementation.
|
|
||||||
+dnl # This change was made to the 4.19.38 and 4.14.120 LTS kernels.
|
|
||||||
+dnl # HAVE_KERNEL_FPU_INITIALIZED
|
|
||||||
dnl #
|
|
||||||
dnl # 4.2: Use __kernel_fpu_{begin,end}()
|
|
||||||
dnl # HAVE_UNDERSCORE_KERNEL_FPU & KERNEL_EXPORTS_X86_FPU
|
|
||||||
@@ -56,10 +63,39 @@ AC_DEFUN([ZFS_AC_KERNEL_FPU], [
|
|
||||||
__kernel_fpu_end();
|
|
||||||
], [__kernel_fpu_begin], [arch/x86/kernel/fpu/core.c arch/x86/kernel/i387.c], [
|
|
||||||
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_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)
|
|
||||||
+ ZFS_LINUX_TRY_COMPILE([
|
|
||||||
+ #include <linux/module.h>
|
|
||||||
+ #include <linux/sched.h>
|
|
||||||
+ ],[
|
|
||||||
+ struct fpu *fpu = ¤t->thread.fpu;
|
|
||||||
+ if (fpu->initialized) { return (0); };
|
|
||||||
+ ],[
|
|
||||||
+ AC_MSG_RESULT(fpu.initialized)
|
|
||||||
+ AC_DEFINE(HAVE_KERNEL_FPU_INITIALIZED, 1,
|
|
||||||
+ [kernel fpu.initialized exists])
|
|
||||||
+ ],[
|
|
||||||
+ ZFS_LINUX_TRY_COMPILE([
|
|
||||||
+ #include <linux/module.h>
|
|
||||||
+ #include <asm/thread_info.h>
|
|
||||||
+
|
|
||||||
+ #if !defined(TIF_NEED_FPU_LOAD)
|
|
||||||
+ #error "TIF_NEED_FPU_LOAD undefined"
|
|
||||||
+ #endif
|
|
||||||
+ ],[
|
|
||||||
+ ],[
|
|
||||||
+ AC_MSG_RESULT(TIF_NEED_FPU_LOAD)
|
|
||||||
+ AC_DEFINE(
|
|
||||||
+ HAVE_KERNEL_TIF_NEED_FPU_LOAD, 1,
|
|
||||||
+ [kernel TIF_NEED_FPU_LOAD exists])
|
|
||||||
+ ],[
|
|
||||||
+ AC_MSG_RESULT(unavailable)
|
|
||||||
+ ])
|
|
||||||
+ ])
|
|
||||||
])
|
|
||||||
])
|
|
||||||
])
|
|
@ -18,15 +18,16 @@ Closes #9041
|
|||||||
Closes #9049
|
Closes #9049
|
||||||
(cherry picked from commit 095b5412b31c07cad5cec74a4eb5ace011c92b27)
|
(cherry picked from commit 095b5412b31c07cad5cec74a4eb5ace011c92b27)
|
||||||
Signed-off-by: Fabian Grünbichler <f.gruenbichler@proxmox.com>
|
Signed-off-by: Fabian Grünbichler <f.gruenbichler@proxmox.com>
|
||||||
|
Signed-off-by: Thomas Lamprecht <t.lamprecht@proxmox.com>
|
||||||
---
|
---
|
||||||
include/linux/simd_x86.h | 9 +++++++++
|
include/linux/simd_x86.h | 9 +++++++++
|
||||||
1 file changed, 9 insertions(+)
|
1 file changed, 9 insertions(+)
|
||||||
|
|
||||||
diff --git a/include/linux/simd_x86.h b/include/linux/simd_x86.h
|
diff --git a/include/linux/simd_x86.h b/include/linux/simd_x86.h
|
||||||
index 2d7a1c3a5..5f243e0cc 100644
|
index 641f43955..edd456098 100644
|
||||||
--- a/include/linux/simd_x86.h
|
--- a/include/linux/simd_x86.h
|
||||||
+++ b/include/linux/simd_x86.h
|
+++ b/include/linux/simd_x86.h
|
||||||
@@ -82,6 +82,15 @@
|
@@ -84,6 +84,15 @@
|
||||||
|
|
||||||
#if defined(_KERNEL)
|
#if defined(_KERNEL)
|
||||||
|
|
@ -1,244 +0,0 @@
|
|||||||
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
|
||||||
From: Tomohiro Kusumi <kusumi.tomohiro@gmail.com>
|
|
||||||
Date: Wed, 10 Jul 2019 01:31:46 +0900
|
|
||||||
Subject: [PATCH] Fix race in parallel mount's thread dispatching algorithm
|
|
||||||
MIME-Version: 1.0
|
|
||||||
Content-Type: text/plain; charset=UTF-8
|
|
||||||
Content-Transfer-Encoding: 8bit
|
|
||||||
|
|
||||||
Strategy of parallel mount is as follows.
|
|
||||||
|
|
||||||
1) Initial thread dispatching is to select sets of mount points that
|
|
||||||
don't have dependencies on other sets, hence threads can/should run
|
|
||||||
lock-less and shouldn't race with other threads for other sets. Each
|
|
||||||
thread dispatched corresponds to top level directory which may or may
|
|
||||||
not have datasets to be mounted on sub directories.
|
|
||||||
|
|
||||||
2) Subsequent recursive thread dispatching for each thread from 1)
|
|
||||||
is to mount datasets for each set of mount points. The mount points
|
|
||||||
within each set have dependencies (i.e. child directories), so child
|
|
||||||
directories are processed only after parent directory completes.
|
|
||||||
|
|
||||||
The problem is that the initial thread dispatching in
|
|
||||||
zfs_foreach_mountpoint() can be multi-threaded when it needs to be
|
|
||||||
single-threaded, and this puts threads under race condition. This race
|
|
||||||
appeared as mount/unmount issues on ZoL for ZoL having different
|
|
||||||
timing regarding mount(2) execution due to fork(2)/exec(2) of mount(8).
|
|
||||||
`zfs unmount -a` which expects proper mount order can't unmount if the
|
|
||||||
mounts were reordered by the race condition.
|
|
||||||
|
|
||||||
There are currently two known patterns of input list `handles` in
|
|
||||||
`zfs_foreach_mountpoint(..,handles,..)` which cause the race condition.
|
|
||||||
|
|
||||||
1) #8833 case where input is `/a /a /a/b` after sorting.
|
|
||||||
The problem is that libzfs_path_contains() can't correctly handle an
|
|
||||||
input list with two same top level directories.
|
|
||||||
There is a race between two POSIX threads A and B,
|
|
||||||
* ThreadA for "/a" for test1 and "/a/b"
|
|
||||||
* ThreadB for "/a" for test0/a
|
|
||||||
and in case of #8833, ThreadA won the race. Two threads were created
|
|
||||||
because "/a" wasn't considered as `"/a" contains "/a"`.
|
|
||||||
|
|
||||||
2) #8450 case where input is `/ /var/data /var/data/test` after sorting.
|
|
||||||
The problem is that libzfs_path_contains() can't correctly handle an
|
|
||||||
input list containing "/".
|
|
||||||
There is a race between two POSIX threads A and B,
|
|
||||||
* ThreadA for "/" and "/var/data/test"
|
|
||||||
* ThreadB for "/var/data"
|
|
||||||
and in case of #8450, ThreadA won the race. Two threads were created
|
|
||||||
because "/var/data" wasn't considered as `"/" contains "/var/data"`.
|
|
||||||
In other words, if there is (at least one) "/" in the input list,
|
|
||||||
the initial thread dispatching must be single-threaded since every
|
|
||||||
directory is a child of "/", meaning they all directly or indirectly
|
|
||||||
depend on "/".
|
|
||||||
|
|
||||||
In both cases, the first non_descendant_idx() call fails to correctly
|
|
||||||
determine "path1-contains-path2", and as a result the initial thread
|
|
||||||
dispatching creates another thread when it needs to be single-threaded.
|
|
||||||
Fix a conditional in libzfs_path_contains() to consider above two.
|
|
||||||
|
|
||||||
Reviewed-by: Brian Behlendorf <behlendorf1@llnl.gov>
|
|
||||||
Reviewed by: Sebastien Roy <sebastien.roy@delphix.com>
|
|
||||||
Signed-off-by: Tomohiro Kusumi <kusumi.tomohiro@gmail.com>
|
|
||||||
Closes #8450
|
|
||||||
Closes #8833
|
|
||||||
Closes #8878
|
|
||||||
(cherry picked from commit ab5036df1ccbe1b18c1ce6160b5829e8039d94ce)
|
|
||||||
Signed-off-by: Fabian Grünbichler <f.gruenbichler@proxmox.com>
|
|
||||||
---
|
|
||||||
.../functional/cli_root/zfs_mount/Makefile.am | 1 +
|
|
||||||
lib/libzfs/libzfs_mount.c | 6 +-
|
|
||||||
tests/runfiles/linux.run | 3 +-
|
|
||||||
.../cli_root/zfs_mount/zfs_mount_test_race.sh | 116 ++++++++++++++++++
|
|
||||||
4 files changed, 123 insertions(+), 3 deletions(-)
|
|
||||||
create mode 100755 tests/zfs-tests/tests/functional/cli_root/zfs_mount/zfs_mount_test_race.sh
|
|
||||||
|
|
||||||
diff --git a/tests/zfs-tests/tests/functional/cli_root/zfs_mount/Makefile.am b/tests/zfs-tests/tests/functional/cli_root/zfs_mount/Makefile.am
|
|
||||||
index b2de98934..c208a1c37 100644
|
|
||||||
--- a/tests/zfs-tests/tests/functional/cli_root/zfs_mount/Makefile.am
|
|
||||||
+++ b/tests/zfs-tests/tests/functional/cli_root/zfs_mount/Makefile.am
|
|
||||||
@@ -19,6 +19,7 @@ dist_pkgdata_SCRIPTS = \
|
|
||||||
zfs_mount_all_mountpoints.ksh \
|
|
||||||
zfs_mount_encrypted.ksh \
|
|
||||||
zfs_mount_remount.ksh \
|
|
||||||
+ zfs_mount_test_race.sh \
|
|
||||||
zfs_multi_mount.ksh
|
|
||||||
|
|
||||||
dist_pkgdata_DATA = \
|
|
||||||
diff --git a/lib/libzfs/libzfs_mount.c b/lib/libzfs/libzfs_mount.c
|
|
||||||
index 649c232aa..d62801cfd 100644
|
|
||||||
--- a/lib/libzfs/libzfs_mount.c
|
|
||||||
+++ b/lib/libzfs/libzfs_mount.c
|
|
||||||
@@ -1302,12 +1302,14 @@ mountpoint_cmp(const void *arga, const void *argb)
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
- * Return true if path2 is a child of path1.
|
|
||||||
+ * Return true if path2 is a child of path1 or path2 equals path1 or
|
|
||||||
+ * path1 is "/" (path2 is always a child of "/").
|
|
||||||
*/
|
|
||||||
static boolean_t
|
|
||||||
libzfs_path_contains(const char *path1, const char *path2)
|
|
||||||
{
|
|
||||||
- return (strstr(path2, path1) == path2 && path2[strlen(path1)] == '/');
|
|
||||||
+ return (strcmp(path1, path2) == 0 || strcmp(path1, "/") == 0 ||
|
|
||||||
+ (strstr(path2, path1) == path2 && path2[strlen(path1)] == '/'));
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
diff --git a/tests/runfiles/linux.run b/tests/runfiles/linux.run
|
|
||||||
index 22fc26212..4d673cc95 100644
|
|
||||||
--- a/tests/runfiles/linux.run
|
|
||||||
+++ b/tests/runfiles/linux.run
|
|
||||||
@@ -182,7 +182,8 @@ tests = ['zfs_mount_001_pos', 'zfs_mount_002_pos', 'zfs_mount_003_pos',
|
|
||||||
'zfs_mount_007_pos', 'zfs_mount_008_pos', 'zfs_mount_009_neg',
|
|
||||||
'zfs_mount_010_neg', 'zfs_mount_011_neg', 'zfs_mount_012_neg',
|
|
||||||
'zfs_mount_all_001_pos', 'zfs_mount_encrypted', 'zfs_mount_remount',
|
|
||||||
- 'zfs_multi_mount', 'zfs_mount_all_fail', 'zfs_mount_all_mountpoints']
|
|
||||||
+ 'zfs_multi_mount', 'zfs_mount_all_fail', 'zfs_mount_all_mountpoints',
|
|
||||||
+ 'zfs_mount_test_race']
|
|
||||||
tags = ['functional', 'cli_root', 'zfs_mount']
|
|
||||||
|
|
||||||
[tests/functional/cli_root/zfs_program]
|
|
||||||
diff --git a/tests/zfs-tests/tests/functional/cli_root/zfs_mount/zfs_mount_test_race.sh b/tests/zfs-tests/tests/functional/cli_root/zfs_mount/zfs_mount_test_race.sh
|
|
||||||
new file mode 100755
|
|
||||||
index 000000000..404770b27
|
|
||||||
--- /dev/null
|
|
||||||
+++ b/tests/zfs-tests/tests/functional/cli_root/zfs_mount/zfs_mount_test_race.sh
|
|
||||||
@@ -0,0 +1,116 @@
|
|
||||||
+#!/bin/ksh
|
|
||||||
+
|
|
||||||
+#
|
|
||||||
+# 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.
|
|
||||||
+#
|
|
||||||
+
|
|
||||||
+#
|
|
||||||
+# Copyright (c) 2019 by Tomohiro Kusumi. All rights reserved.
|
|
||||||
+#
|
|
||||||
+
|
|
||||||
+. $STF_SUITE/include/libtest.shlib
|
|
||||||
+. $STF_SUITE/tests/functional/cli_root/zfs_mount/zfs_mount.cfg
|
|
||||||
+
|
|
||||||
+#
|
|
||||||
+# DESCRIPTION:
|
|
||||||
+# Verify parallel mount ordering is consistent.
|
|
||||||
+#
|
|
||||||
+# There was a bug in initial thread dispatching algorithm which put threads
|
|
||||||
+# under race condition which resulted in undefined mount order. The purpose
|
|
||||||
+# of this test is to verify `zfs unmount -a` succeeds (not `zfs mount -a`
|
|
||||||
+# succeeds, it always does) after `zfs mount -a`, which could fail if threads
|
|
||||||
+# race. See github.com/zfsonlinux/zfs/issues/{8450,8833,8878} for details.
|
|
||||||
+#
|
|
||||||
+# STRATEGY:
|
|
||||||
+# 1. Create pools and filesystems.
|
|
||||||
+# 2. Set same mount point for >1 datasets.
|
|
||||||
+# 3. Unmount all datasets.
|
|
||||||
+# 4. Mount all datasets.
|
|
||||||
+# 5. Unmount all datasets (verify this succeeds).
|
|
||||||
+#
|
|
||||||
+
|
|
||||||
+verify_runnable "both"
|
|
||||||
+
|
|
||||||
+TMPDIR=${TMPDIR:-$TEST_BASE_DIR}
|
|
||||||
+MNTPT=$TMPDIR/zfs_mount_test_race_mntpt
|
|
||||||
+DISK1="$TMPDIR/zfs_mount_test_race_disk1"
|
|
||||||
+DISK2="$TMPDIR/zfs_mount_test_race_disk2"
|
|
||||||
+
|
|
||||||
+TESTPOOL1=zfs_mount_test_race_tp1
|
|
||||||
+TESTPOOL2=zfs_mount_test_race_tp2
|
|
||||||
+
|
|
||||||
+export __ZFS_POOL_RESTRICT="$TESTPOOL1 $TESTPOOL2"
|
|
||||||
+log_must zfs $unmountall
|
|
||||||
+unset __ZFS_POOL_RESTRICT
|
|
||||||
+
|
|
||||||
+function cleanup
|
|
||||||
+{
|
|
||||||
+ zpool destroy $TESTPOOL1
|
|
||||||
+ zpool destroy $TESTPOOL2
|
|
||||||
+ rm -rf $MNTPT
|
|
||||||
+ rm -rf /$TESTPOOL1
|
|
||||||
+ rm -rf /$TESTPOOL2
|
|
||||||
+ rm -f $DISK1
|
|
||||||
+ rm -f $DISK2
|
|
||||||
+ export __ZFS_POOL_RESTRICT="$TESTPOOL1 $TESTPOOL2"
|
|
||||||
+ log_must zfs $mountall
|
|
||||||
+ unset __ZFS_POOL_RESTRICT
|
|
||||||
+}
|
|
||||||
+log_onexit cleanup
|
|
||||||
+
|
|
||||||
+log_note "Verify parallel mount ordering is consistent"
|
|
||||||
+
|
|
||||||
+log_must truncate -s $MINVDEVSIZE $DISK1
|
|
||||||
+log_must truncate -s $MINVDEVSIZE $DISK2
|
|
||||||
+
|
|
||||||
+log_must zpool create -f $TESTPOOL1 $DISK1
|
|
||||||
+log_must zpool create -f $TESTPOOL2 $DISK2
|
|
||||||
+
|
|
||||||
+log_must zfs create $TESTPOOL1/$TESTFS1
|
|
||||||
+log_must zfs create $TESTPOOL2/$TESTFS2
|
|
||||||
+
|
|
||||||
+log_must zfs set mountpoint=none $TESTPOOL1
|
|
||||||
+log_must zfs set mountpoint=$MNTPT $TESTPOOL1/$TESTFS1
|
|
||||||
+
|
|
||||||
+# Note that unmount can fail (due to race condition on `zfs mount -a`) with or
|
|
||||||
+# without `canmount=off`. The race has nothing to do with canmount property,
|
|
||||||
+# but turn it off for convenience of mount layout used in this test case.
|
|
||||||
+log_must zfs set canmount=off $TESTPOOL2
|
|
||||||
+log_must zfs set mountpoint=$MNTPT $TESTPOOL2
|
|
||||||
+
|
|
||||||
+# At this point, layout of datasets in two pools will look like below.
|
|
||||||
+# Previously, on next `zfs mount -a`, pthreads assigned to TESTFS1 and TESTFS2
|
|
||||||
+# could race, and TESTFS2 usually (actually always) won in ZoL. Note that the
|
|
||||||
+# problem is how two or more threads could initially be assigned to the same
|
|
||||||
+# top level directory, not this specific layout. This layout is just an example
|
|
||||||
+# that can reproduce race, and is also the layout reported in #8833.
|
|
||||||
+#
|
|
||||||
+# NAME MOUNTED MOUNTPOINT
|
|
||||||
+# ----------------------------------------------
|
|
||||||
+# /$TESTPOOL1 no none
|
|
||||||
+# /$TESTPOOL1/$TESTFS1 yes $MNTPT
|
|
||||||
+# /$TESTPOOL2 no $MNTPT
|
|
||||||
+# /$TESTPOOL2/$TESTFS2 yes $MNTPT/$TESTFS2
|
|
||||||
+
|
|
||||||
+# Apparently two datasets must be mounted.
|
|
||||||
+log_must ismounted $TESTPOOL1/$TESTFS1
|
|
||||||
+log_must ismounted $TESTPOOL2/$TESTFS2
|
|
||||||
+# This unmount always succeeds, because potential race hasn't happened yet.
|
|
||||||
+log_must zfs unmount -a
|
|
||||||
+# This mount always succeeds, whether threads are under race condition or not.
|
|
||||||
+log_must zfs mount -a
|
|
||||||
+
|
|
||||||
+# Verify datasets are mounted (TESTFS2 fails if the race broke mount order).
|
|
||||||
+log_must ismounted $TESTPOOL1/$TESTFS1
|
|
||||||
+log_must ismounted $TESTPOOL2/$TESTFS2
|
|
||||||
+# Verify unmount succeeds (fails if the race broke mount order).
|
|
||||||
+log_must zfs unmount -a
|
|
||||||
+
|
|
||||||
+log_pass "Verify parallel mount ordering is consistent passed"
|
|
@ -14,10 +14,10 @@ Signed-off-by: Thomas Lamprecht <t.lamprecht@proxmox.com>
|
|||||||
1 file changed, 1 insertion(+), 10 deletions(-)
|
1 file changed, 1 insertion(+), 10 deletions(-)
|
||||||
|
|
||||||
diff --git a/include/linux/simd_x86.h b/include/linux/simd_x86.h
|
diff --git a/include/linux/simd_x86.h b/include/linux/simd_x86.h
|
||||||
index 5f243e0cc..aac63d964 100644
|
index edd456098..13aa77345 100644
|
||||||
--- a/include/linux/simd_x86.h
|
--- a/include/linux/simd_x86.h
|
||||||
+++ b/include/linux/simd_x86.h
|
+++ b/include/linux/simd_x86.h
|
||||||
@@ -179,7 +179,6 @@ kfpu_begin(void)
|
@@ -181,7 +181,6 @@ kfpu_begin(void)
|
||||||
preempt_disable();
|
preempt_disable();
|
||||||
local_irq_disable();
|
local_irq_disable();
|
||||||
|
|
||||||
@ -25,7 +25,7 @@ index 5f243e0cc..aac63d964 100644
|
|||||||
/*
|
/*
|
||||||
* The current FPU registers need to be preserved by kfpu_begin()
|
* The current FPU registers need to be preserved by kfpu_begin()
|
||||||
* and restored by kfpu_end(). This is required because we can
|
* and restored by kfpu_end(). This is required because we can
|
||||||
@@ -188,20 +187,13 @@ kfpu_begin(void)
|
@@ -190,20 +189,13 @@ kfpu_begin(void)
|
||||||
* context switch.
|
* context switch.
|
||||||
*/
|
*/
|
||||||
copy_fpregs_to_fpstate(¤t->thread.fpu);
|
copy_fpregs_to_fpstate(¤t->thread.fpu);
|
||||||
@ -47,7 +47,7 @@ index 5f243e0cc..aac63d964 100644
|
|||||||
union fpregs_state *state = ¤t->thread.fpu.state;
|
union fpregs_state *state = ¤t->thread.fpu.state;
|
||||||
int error;
|
int error;
|
||||||
|
|
||||||
@@ -213,7 +205,6 @@ kfpu_end(void)
|
@@ -215,7 +207,6 @@ kfpu_end(void)
|
||||||
error = copy_kernel_to_fregs_err(&state->fsave);
|
error = copy_kernel_to_fregs_err(&state->fsave);
|
||||||
}
|
}
|
||||||
WARN_ON_ONCE(error);
|
WARN_ON_ONCE(error);
|
12
debian/patches/series
vendored
12
debian/patches/series
vendored
@ -1,10 +1,8 @@
|
|||||||
0001-Check-for-META-and-DCH-consistency-in-autoconf.patch
|
0001-Check-for-META-and-DCH-consistency-in-autoconf.patch
|
||||||
0002-always-load-ZFS-module-on-boot.patch
|
0002-always-load-ZFS-module-on-boot.patch
|
||||||
0003-Fix-the-path-to-the-zed-binary-on-the-systemd-unit.patch
|
0003-Fix-the-path-to-the-zed-binary-on-the-systemd-unit.patch
|
||||||
0004-increase-default-zcmd-allocation-to-256K.patch
|
0004-import-with-d-dev-disk-by-id-in-scan-service.patch
|
||||||
0005-import-with-d-dev-disk-by-id-in-scan-service.patch
|
0005-Enable-zed-emails.patch
|
||||||
0006-Enable-zed-emails.patch
|
0006-Linux-5.0-compat-SIMD-compatibility.patch
|
||||||
0007-Fix-race-in-parallel-mount-s-thread-dispatching-algo.patch
|
0007-Fix-CONFIG_X86_DEBUG_FPU-build-failure.patch
|
||||||
0008-Linux-5.0-compat-SIMD-compatibility.patch
|
0008-SIMD-FPU-register-save-restore-is-also-required-on-5.patch
|
||||||
0009-Fix-CONFIG_X86_DEBUG_FPU-build-failure.patch
|
|
||||||
0010-SIMD-FPU-register-save-restore-is-also-required-on-5.patch
|
|
||||||
|
2
upstream
2
upstream
@ -1 +1 @@
|
|||||||
Subproject commit 63b88f7e223c1061c522762803b1431e7faba5b3
|
Subproject commit 1222e921c9e3d8f5c693f196435be4604a1187c0
|
Loading…
Reference in New Issue
Block a user