]> git.proxmox.com Git - zfsonlinux.git/blob - zfs-patches/0053-Fix-MMP-write-frequency-for-large-pools.patch
revert potentially buggy zap_add change
[zfsonlinux.git] / zfs-patches / 0053-Fix-MMP-write-frequency-for-large-pools.patch
1 From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
2 From: Brian Behlendorf <behlendorf1@llnl.gov>
3 Date: Mon, 12 Mar 2018 11:26:05 -0700
4 Subject: [PATCH] Fix MMP write frequency for large pools
5 MIME-Version: 1.0
6 Content-Type: text/plain; charset=UTF-8
7 Content-Transfer-Encoding: 8bit
8
9 When a single pool contains more vdevs than the CONFIG_HZ for
10 for the kernel the mmp thread will not delay properly. Switch
11 to using cv_timedwait_sig_hires() to handle higher resolution
12 delays.
13
14 This issue was reported on Arch Linux where HZ defaults to only
15 100 and this could be fairly easily reproduced with a reasonably
16 large pool. Most distribution kernels set CONFIG_HZ=250 or
17 CONFIG_HZ=1000 and thus are unlikely to be impacted.
18
19 Reviewed-by: George Melikov <mail@gmelikov.ru>
20 Reviewed-by: Giuseppe Di Natale <dinatale2@llnl.gov>
21 Reviewed-by: Olaf Faaland <faaland1@llnl.gov>
22 Reviewed-by: Tony Hutter <hutter2@llnl.gov>
23 Signed-off-by: Brian Behlendorf <behlendorf1@llnl.gov>
24 Closes #7205
25 Closes #7289
26 (cherry picked from commit c30e716c8149b7df7cf968373c22aa00b48d17b8)
27 Signed-off-by: Fabian Grünbichler <f.gruenbichler@proxmox.com>
28 ---
29 lib/libspl/include/sys/time.h | 6 +++++-
30 module/zfs/mmp.c | 6 +++---
31 2 files changed, 8 insertions(+), 4 deletions(-)
32
33 diff --git a/lib/libspl/include/sys/time.h b/lib/libspl/include/sys/time.h
34 index f05fcaa1c..dc645fa5c 100644
35 --- a/lib/libspl/include/sys/time.h
36 +++ b/lib/libspl/include/sys/time.h
37 @@ -54,10 +54,14 @@
38 #define MSEC2NSEC(m) ((hrtime_t)(m) * (NANOSEC / MILLISEC))
39 #endif
40
41 -#ifndef NSEC2MSEC
42 +#ifndef NSEC2MSEC
43 #define NSEC2MSEC(n) ((n) / (NANOSEC / MILLISEC))
44 #endif
45
46 +#ifndef USEC2NSEC
47 +#define USEC2NSEC(m) ((hrtime_t)(m) * (NANOSEC / MICROSEC))
48 +#endif
49 +
50 #ifndef NSEC2SEC
51 #define NSEC2SEC(n) ((n) / (NANOSEC / SEC))
52 #endif
53 diff --git a/module/zfs/mmp.c b/module/zfs/mmp.c
54 index 15eea41ab..dc5c6a74f 100644
55 --- a/module/zfs/mmp.c
56 +++ b/module/zfs/mmp.c
57 @@ -462,9 +462,9 @@ mmp_thread(spa_t *spa)
58 mmp_write_uberblock(spa);
59
60 CALLB_CPR_SAFE_BEGIN(&cpr);
61 - (void) cv_timedwait_sig(&mmp->mmp_thread_cv,
62 - &mmp->mmp_thread_lock, ddi_get_lbolt() +
63 - ((next_time - gethrtime()) / (NANOSEC / hz)));
64 + (void) cv_timedwait_sig_hires(&mmp->mmp_thread_cv,
65 + &mmp->mmp_thread_lock, next_time, USEC2NSEC(1),
66 + CALLOUT_FLAG_ABSOLUTE);
67 CALLB_CPR_SAFE_END(&cpr, &mmp->mmp_thread_lock);
68 }
69
70 --
71 2.14.2
72