diff options
author | Alexander Motin <[email protected]> | 2020-10-30 11:57:54 -0400 |
---|---|---|
committer | GitHub <[email protected]> | 2020-10-30 08:57:54 -0700 |
commit | 1199c3e8fb9006f28e11c747101ba770cc0bf743 (patch) | |
tree | c7519903ec9eb15045d5e4e4d4d3e83732894ff4 /module/zfs | |
parent | 76d04993a60fcd30bbb815cfa7f716cbebcdfcbd (diff) |
Yield periodically when rebuilding L2ARC
L2ARC devices of several terabytes filled with 4KB blocks may take 15
minutes to rebuild. Due to the way L2ARC log reading is implemented
it is quite likely that for all that time rebuild thread will never
sleep. At least on FreeBSD kernel threads have absolute priority and
can not be preempted by threads with lower priorities. If some thread
is also bound to that specific CPU it may not get any CPU time for all
the 15 minutes.
Reviewed-by: Cedric Berger <[email protected]>
Reviewed-by: Ryan Moeller <[email protected]>
Reviewed-by: George Amanakis <[email protected]>
Reviewed-by: Brian Behlendorf <[email protected]>
Signed-off-by: Alexander Motin <[email protected]>
Closes #11116
Diffstat (limited to 'module/zfs')
-rw-r--r-- | module/zfs/arc.c | 1 |
1 files changed, 1 insertions, 0 deletions
diff --git a/module/zfs/arc.c b/module/zfs/arc.c index 1e3d47693..72a71bafd 100644 --- a/module/zfs/arc.c +++ b/module/zfs/arc.c @@ -9893,6 +9893,7 @@ l2arc_rebuild(l2arc_dev_t *dev) !dev->l2ad_first) goto out; + cond_resched(); for (;;) { mutex_enter(&l2arc_rebuild_thr_lock); if (dev->l2ad_rebuild_cancel) { |