diff options
author | Brian Behlendorf <[email protected]> | 2010-12-10 12:00:00 -0800 |
---|---|---|
committer | Brian Behlendorf <[email protected]> | 2010-12-14 10:06:44 -0800 |
commit | 5b63b3eb6f42f3d9f6a19b22c3f10f72927eeacc (patch) | |
tree | e748e57cc0c2b97a728daec9fb703fcc3c197760 /module/zfs | |
parent | 8d4e8140ef67fa9c8fa0b1d0f5b1d5d36c747969 (diff) |
Use cv_timedwait_interruptible in arc
The issue is that cv_timedwait() sleeps uninterruptibly to block signals
and avoid waking up early. Under Linux this counts against the load
average keeping it artificially high. This change allows the arc to
sleep interruptibly which mean it may be woken up early due to a signal.
Normally this means some extra care must be taken to handle a potential
signal. But for the arcs usage of cv_timedwait() there is no harm in
waking up before the timeout expires so no extra handling is required.
Diffstat (limited to 'module/zfs')
-rw-r--r-- | module/zfs/arc.c | 6 |
1 files changed, 3 insertions, 3 deletions
diff --git a/module/zfs/arc.c b/module/zfs/arc.c index 32d99bf39..808c8e8df 100644 --- a/module/zfs/arc.c +++ b/module/zfs/arc.c @@ -2149,7 +2149,7 @@ arc_reclaim_thread(void) /* block until needed, or one second, whichever is shorter */ CALLB_CPR_SAFE_BEGIN(&cpr); - (void) cv_timedwait(&arc_reclaim_thr_cv, + (void) cv_timedwait_interruptible(&arc_reclaim_thr_cv, &arc_reclaim_thr_lock, (ddi_get_lbolt() + hz)); CALLB_CPR_SAFE_END(&cpr, &arc_reclaim_thr_lock); } @@ -4435,8 +4435,8 @@ l2arc_feed_thread(void) while (l2arc_thread_exit == 0) { CALLB_CPR_SAFE_BEGIN(&cpr); - (void) cv_timedwait(&l2arc_feed_thr_cv, &l2arc_feed_thr_lock, - next); + (void) cv_timedwait_interruptible(&l2arc_feed_thr_cv, + &l2arc_feed_thr_lock, next); CALLB_CPR_SAFE_END(&cpr, &l2arc_feed_thr_lock); next = ddi_get_lbolt() + hz; |