update submodule and patches to 0.8.2

Signed-off-by: Thomas Lamprecht <t.lamprecht@proxmox.com>
This commit is contained in:
Thomas Lamprecht 2019-09-28 08:12:00 +02:00
parent 33e3621234
commit 08743f90d9
12 changed files with 188 additions and 500 deletions

View File

@ -4,6 +4,7 @@ From: Debian ZFS on Linux maintainers
Date: Wed, 30 Jan 2019 15:12:04 +0100
Subject: [PATCH] Check-for-META-and-DCH-consistency-in-autoconf
Signed-off-by: Thomas Lamprecht <t.lamprecht@proxmox.com>
---
config/zfs-meta.m4 | 34 +++++++++++++++++++++++++++++-----
1 file changed, 29 insertions(+), 5 deletions(-)

View File

@ -13,6 +13,7 @@ not actually used.
Signed-off-by: Fabian Grünbichler <f.gruenbichler@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 +-
1 file changed, 1 insertion(+), 1 deletion(-)

View File

@ -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
installing it into /sbin. Ubuntu packages also install zed to /usr/sbin, but
they ship their own zfs-zed unit.
Signed-off-by: Thomas Lamprecht <t.lamprecht@proxmox.com>
---
etc/systemd/system/zfs-zed.service.in | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)

View File

@ -8,6 +8,7 @@ Content-Transfer-Encoding: 8bit
Signed-off-by: Fabian Grünbichler <f.gruenbichler@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 +-
1 file changed, 1 insertion(+), 1 deletion(-)

View File

@ -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);

View File

@ -6,6 +6,8 @@ Subject: [PATCH] Enable zed emails
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
behavior of mdadm.
Signed-off-by: Thomas Lamprecht <t.lamprecht@proxmox.com>
---
cmd/zed/zed.d/zed.rc | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)

View File

@ -61,20 +61,22 @@ Closes #8793
Closes #8965
(cherry picked from commit e5db31349484e5e859c7a942eb15b98d68ce5b4d)
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/simd.h | 41 +++++
include/linux/simd_aarch64.h | 18 +-
include/linux/simd_x86.h | 192 +++++++++++++-------
include/sys/vdev_raidz.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_aesni.c | 2 +-
module/icp/algs/modes/gcm.c | 41 +++--
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/spl/spl-taskq.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_sse2.c | 2 +-
module/zfs/vdev_raidz_math_ssse3.c | 4 +-
config/kernel-fpu.m4 | 46 ++++-
30 files changed, 454 insertions(+), 204 deletions(-)
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 = &current->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
index efb49520e..2455759e8 100644
--- a/include/linux/Makefile.am
@ -155,10 +242,10 @@ index 000000000..d2b60996a
+#endif
+#endif /* _SIMD_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
+++ b/include/linux/simd_aarch64.h
@@ -41,20 +41,18 @@
@@ -43,20 +43,18 @@
#if defined(_KERNEL)
#include <asm/neon.h>
@ -188,10 +275,10 @@ index 155ef6205..1cfcd01e4 100644
#endif /* __aarch64__ */
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
+++ b/include/linux/simd_x86.h
@@ -90,33 +90,135 @@
@@ -92,33 +92,135 @@
#include <asm/xcr.h>
#endif
@ -342,7 +429,7 @@ index 12cd74677..2d7a1c3a5 100644
#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;
#if defined(_KERNEL)
@ -351,7 +438,7 @@ index 12cd74677..2d7a1c3a5 100644
has_osxsave = !!boot_cpu_has(X86_FEATURE_OSXSAVE);
#else
has_osxsave = B_FALSE;
@@ -328,11 +430,7 @@ static inline boolean_t
@@ -330,11 +432,7 @@ static inline boolean_t
zfs_sse_available(void)
{
#if defined(_KERNEL)
@ -363,7 +450,7 @@ index 12cd74677..2d7a1c3a5 100644
#elif !defined(_KERNEL)
return (__cpuid_has_sse());
#endif
@@ -345,11 +443,7 @@ static inline boolean_t
@@ -347,11 +445,7 @@ static inline boolean_t
zfs_sse2_available(void)
{
#if defined(_KERNEL)
@ -375,7 +462,7 @@ index 12cd74677..2d7a1c3a5 100644
#elif !defined(_KERNEL)
return (__cpuid_has_sse2());
#endif
@@ -362,11 +456,7 @@ static inline boolean_t
@@ -364,11 +458,7 @@ static inline boolean_t
zfs_sse3_available(void)
{
#if defined(_KERNEL)
@ -387,7 +474,7 @@ index 12cd74677..2d7a1c3a5 100644
#elif !defined(_KERNEL)
return (__cpuid_has_sse3());
#endif
@@ -379,11 +469,7 @@ static inline boolean_t
@@ -381,11 +471,7 @@ static inline boolean_t
zfs_ssse3_available(void)
{
#if defined(_KERNEL)
@ -399,7 +486,7 @@ index 12cd74677..2d7a1c3a5 100644
#elif !defined(_KERNEL)
return (__cpuid_has_ssse3());
#endif
@@ -396,11 +482,7 @@ static inline boolean_t
@@ -398,11 +484,7 @@ static inline boolean_t
zfs_sse4_1_available(void)
{
#if defined(_KERNEL)
@ -411,7 +498,7 @@ index 12cd74677..2d7a1c3a5 100644
#elif !defined(_KERNEL)
return (__cpuid_has_sse4_1());
#endif
@@ -413,11 +495,7 @@ static inline boolean_t
@@ -415,11 +497,7 @@ static inline boolean_t
zfs_sse4_2_available(void)
{
#if defined(_KERNEL)
@ -423,7 +510,7 @@ index 12cd74677..2d7a1c3a5 100644
#elif !defined(_KERNEL)
return (__cpuid_has_sse4_2());
#endif
@@ -431,11 +509,7 @@ zfs_avx_available(void)
@@ -433,11 +511,7 @@ zfs_avx_available(void)
{
boolean_t has_avx;
#if defined(_KERNEL)
@ -435,7 +522,7 @@ index 12cd74677..2d7a1c3a5 100644
#elif !defined(_KERNEL)
has_avx = __cpuid_has_avx();
#endif
@@ -451,11 +525,7 @@ zfs_avx2_available(void)
@@ -453,11 +527,7 @@ zfs_avx2_available(void)
{
boolean_t has_avx2;
#if defined(_KERNEL)
@ -447,7 +534,7 @@ index 12cd74677..2d7a1c3a5 100644
#elif !defined(_KERNEL)
has_avx2 = __cpuid_has_avx2();
#endif
@@ -470,7 +540,7 @@ static inline boolean_t
@@ -472,7 +542,7 @@ static inline boolean_t
zfs_bmi1_available(void)
{
#if defined(_KERNEL)
@ -456,7 +543,7 @@ index 12cd74677..2d7a1c3a5 100644
return (!!boot_cpu_has(X86_FEATURE_BMI1));
#else
return (B_FALSE);
@@ -487,7 +557,7 @@ static inline boolean_t
@@ -489,7 +559,7 @@ static inline boolean_t
zfs_bmi2_available(void)
{
#if defined(_KERNEL)
@ -465,7 +552,7 @@ index 12cd74677..2d7a1c3a5 100644
return (!!boot_cpu_has(X86_FEATURE_BMI2));
#else
return (B_FALSE);
@@ -504,7 +574,7 @@ static inline boolean_t
@@ -506,7 +576,7 @@ static inline boolean_t
zfs_aes_available(void)
{
#if defined(_KERNEL)
@ -474,7 +561,7 @@ index 12cd74677..2d7a1c3a5 100644
return (!!boot_cpu_has(X86_FEATURE_AES));
#else
return (B_FALSE);
@@ -521,7 +591,7 @@ static inline boolean_t
@@ -523,7 +593,7 @@ static inline boolean_t
zfs_pclmulqdq_available(void)
{
#if defined(_KERNEL)
@ -483,7 +570,7 @@ index 12cd74677..2d7a1c3a5 100644
return (!!boot_cpu_has(X86_FEATURE_PCLMULQDQ));
#else
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;
#if defined(_KERNEL)
@ -492,7 +579,7 @@ index 12cd74677..2d7a1c3a5 100644
has_avx512 = !!boot_cpu_has(X86_FEATURE_AVX512F);
#else
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;
#if defined(_KERNEL)
@ -501,7 +588,7 @@ index 12cd74677..2d7a1c3a5 100644
has_avx512 = boot_cpu_has(X86_FEATURE_AVX512F) &&
boot_cpu_has(X86_FEATURE_AVX512CD);
#else
@@ -594,7 +664,7 @@ zfs_avx512er_available(void)
@@ -596,7 +666,7 @@ zfs_avx512er_available(void)
boolean_t has_avx512 = B_FALSE;
#if defined(_KERNEL)
@ -510,7 +597,7 @@ index 12cd74677..2d7a1c3a5 100644
has_avx512 = boot_cpu_has(X86_FEATURE_AVX512F) &&
boot_cpu_has(X86_FEATURE_AVX512ER);
#else
@@ -614,7 +684,7 @@ zfs_avx512pf_available(void)
@@ -616,7 +686,7 @@ zfs_avx512pf_available(void)
boolean_t has_avx512 = B_FALSE;
#if defined(_KERNEL)
@ -519,7 +606,7 @@ index 12cd74677..2d7a1c3a5 100644
has_avx512 = boot_cpu_has(X86_FEATURE_AVX512F) &&
boot_cpu_has(X86_FEATURE_AVX512PF);
#else
@@ -634,7 +704,7 @@ zfs_avx512bw_available(void)
@@ -636,7 +706,7 @@ zfs_avx512bw_available(void)
boolean_t has_avx512 = B_FALSE;
#if defined(_KERNEL)
@ -528,7 +615,7 @@ index 12cd74677..2d7a1c3a5 100644
has_avx512 = boot_cpu_has(X86_FEATURE_AVX512F) &&
boot_cpu_has(X86_FEATURE_AVX512BW);
#else
@@ -654,7 +724,7 @@ zfs_avx512dq_available(void)
@@ -656,7 +726,7 @@ zfs_avx512dq_available(void)
boolean_t has_avx512 = B_FALSE;
#if defined(_KERNEL)
@ -537,7 +624,7 @@ index 12cd74677..2d7a1c3a5 100644
has_avx512 = boot_cpu_has(X86_FEATURE_AVX512F) &&
boot_cpu_has(X86_FEATURE_AVX512DQ);
#else
@@ -674,7 +744,7 @@ zfs_avx512vl_available(void)
@@ -676,7 +746,7 @@ zfs_avx512vl_available(void)
boolean_t has_avx512 = B_FALSE;
#if defined(_KERNEL)
@ -546,7 +633,7 @@ index 12cd74677..2d7a1c3a5 100644
has_avx512 = boot_cpu_has(X86_FEATURE_AVX512F) &&
boot_cpu_has(X86_FEATURE_AVX512VL);
#else
@@ -694,7 +764,7 @@ zfs_avx512ifma_available(void)
@@ -696,7 +766,7 @@ zfs_avx512ifma_available(void)
boolean_t has_avx512 = B_FALSE;
#if defined(_KERNEL)
@ -555,7 +642,7 @@ index 12cd74677..2d7a1c3a5 100644
has_avx512 = boot_cpu_has(X86_FEATURE_AVX512F) &&
boot_cpu_has(X86_FEATURE_AVX512IFMA);
#else
@@ -714,7 +784,7 @@ zfs_avx512vbmi_available(void)
@@ -716,7 +786,7 @@ zfs_avx512vbmi_available(void)
boolean_t has_avx512 = B_FALSE;
#if defined(_KERNEL)
@ -590,69 +677,8 @@ index 0799ed19d..4969d110b 100644
raidz_col_t rm_col[1]; /* Flexible array of I/O columns */
} 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
index e15050635..457b9e45c 100644
index 36e0686a5..0f11f9999 100644
--- a/module/icp/algs/aes/aes_impl.c
+++ b/module/icp/algs/aes/aes_impl.c
@@ -27,6 +27,7 @@
@ -750,7 +776,7 @@ index 97f7c3a47..222c176aa 100644
const aes_impl_ops_t aes_aesni_impl = {
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
+++ b/module/icp/algs/modes/gcm.c
@@ -29,6 +29,7 @@
@ -875,7 +901,7 @@ index 13bceef0f..f6f8434de 100644
+ * hardware accelerated version is the fastest.
+ */
#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,
diff --git a/module/icp/algs/modes/gcm_pclmulqdq.c b/module/icp/algs/modes/gcm_pclmulqdq.c
index be00ba37b..8a43ba33a 100644
@ -890,6 +916,46 @@ index be00ba37b..8a43ba33a 100644
}
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
index 53b193693..51538bc60 100644
--- a/module/icp/io/aes.c
@ -934,10 +1000,10 @@ index 53b193693..51538bc60 100644
if ((ret = mod_install(&modlinkage)) != 0)
return (ret);
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
+++ b/module/spl/spl-taskq.c
@@ -27,6 +27,7 @@
@@ -28,6 +28,7 @@
#include <sys/taskq.h>
#include <sys/kmem.h>
#include <sys/tsd.h>
@ -945,7 +1011,7 @@ index 7684257be..de0e45190 100644
int spl_taskq_thread_bind = 0;
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);
sigprocmask(SIG_BLOCK, &blocked, NULL);
flush_signals(current);
@ -954,7 +1020,7 @@ index 7684257be..de0e45190 100644
tsd_set(taskq_tsd, tq);
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
index d441ad65f..c4977bcf2 100644
index 0352a31ea..07e3a1bff 100644
--- a/module/spl/spl-thread.c
+++ b/module/spl/spl-thread.c
@@ -27,6 +27,7 @@
@ -974,7 +1040,7 @@ index d441ad65f..c4977bcf2 100644
kmem_free(tp, sizeof (thread_priv_t));
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
+++ b/module/zcommon/zfs_fletcher.c
@@ -140,6 +140,7 @@
@ -1054,7 +1120,7 @@ index 5a991ba60..b75d8ab00 100644
ops = fletcher_4_supp_impls[impl];
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 *,
zio_cksum_t *);
@ -1221,7 +1287,7 @@ index a0b42e5f5..e6389d6e5 100644
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
index e6112bc02..e7a39015c 100644
index 3ef67768f..ef514e9e1 100644
--- a/module/zfs/vdev_raidz_math.c
+++ b/module/zfs/vdev_raidz_math.c
@@ -27,9 +27,9 @@
@ -1348,7 +1414,7 @@ index e6112bc02..e7a39015c 100644
+ raidz_map_t *bench_rm = NULL;
+ 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);
@@ -480,7 +476,7 @@ vdev_raidz_math_init(void)
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 = {
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 = &current->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)
+ ])
+ ])
])
])
])

View File

@ -18,15 +18,16 @@ Closes #9041
Closes #9049
(cherry picked from commit 095b5412b31c07cad5cec74a4eb5ace011c92b27)
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 +++++++++
1 file changed, 9 insertions(+)
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
+++ b/include/linux/simd_x86.h
@@ -82,6 +82,15 @@
@@ -84,6 +84,15 @@
#if defined(_KERNEL)

View File

@ -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"

View File

@ -14,10 +14,10 @@ Signed-off-by: Thomas Lamprecht <t.lamprecht@proxmox.com>
1 file changed, 1 insertion(+), 10 deletions(-)
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
+++ b/include/linux/simd_x86.h
@@ -179,7 +179,6 @@ kfpu_begin(void)
@@ -181,7 +181,6 @@ kfpu_begin(void)
preempt_disable();
local_irq_disable();
@ -25,7 +25,7 @@ index 5f243e0cc..aac63d964 100644
/*
* The current FPU registers need to be preserved by kfpu_begin()
* 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.
*/
copy_fpregs_to_fpstate(&current->thread.fpu);
@ -47,7 +47,7 @@ index 5f243e0cc..aac63d964 100644
union fpregs_state *state = &current->thread.fpu.state;
int error;
@@ -213,7 +205,6 @@ kfpu_end(void)
@@ -215,7 +207,6 @@ kfpu_end(void)
error = copy_kernel_to_fregs_err(&state->fsave);
}
WARN_ON_ONCE(error);

12
debian/patches/series vendored
View File

@ -1,10 +1,8 @@
0001-Check-for-META-and-DCH-consistency-in-autoconf.patch
0002-always-load-ZFS-module-on-boot.patch
0003-Fix-the-path-to-the-zed-binary-on-the-systemd-unit.patch
0004-increase-default-zcmd-allocation-to-256K.patch
0005-import-with-d-dev-disk-by-id-in-scan-service.patch
0006-Enable-zed-emails.patch
0007-Fix-race-in-parallel-mount-s-thread-dispatching-algo.patch
0008-Linux-5.0-compat-SIMD-compatibility.patch
0009-Fix-CONFIG_X86_DEBUG_FPU-build-failure.patch
0010-SIMD-FPU-register-save-restore-is-also-required-on-5.patch
0004-import-with-d-dev-disk-by-id-in-scan-service.patch
0005-Enable-zed-emails.patch
0006-Linux-5.0-compat-SIMD-compatibility.patch
0007-Fix-CONFIG_X86_DEBUG_FPU-build-failure.patch
0008-SIMD-FPU-register-save-restore-is-also-required-on-5.patch

@ -1 +1 @@
Subproject commit 63b88f7e223c1061c522762803b1431e7faba5b3
Subproject commit 1222e921c9e3d8f5c693f196435be4604a1187c0