diff options
author | Neependra Khare <[email protected]> | 2010-12-06 17:05:58 +0530 |
---|---|---|
committer | Brian Behlendorf <[email protected]> | 2011-01-11 12:14:48 -0800 |
commit | 3f688a8c381d298062467a318994bb5849b1c8c1 (patch) | |
tree | 9928481bcc392993b97eabdeeffac8dfa5b5485e /module/spl/spl-condvar.c | |
parent | 6bf4d76f4782a13f3ed378d77a0bc17967c3642a (diff) |
Add cv_timedwait_interruptible() function
The cv_timedwait() function by definition must wait unconditionally
for cv_signal()/cv_broadcast() before waking. This causes processes
to go in the D state which increases the load average. The load
average is the summation of processes in D state and run queue.
To avoid this it can be desirable to sleep interruptibly. These
processes do not count against the load average but may be woken by
a signal. It is up to the caller to determine why the process
was woken it may be for one of three reasons.
1) cv_signal()/cv_broadcast()
2) the timeout expired
3) a signal was received
Signed-off-by: Brian Behlendorf <[email protected]>
Diffstat (limited to 'module/spl/spl-condvar.c')
-rw-r--r-- | module/spl/spl-condvar.c | 21 |
1 files changed, 17 insertions, 4 deletions
diff --git a/module/spl/spl-condvar.c b/module/spl/spl-condvar.c index edf048bb7..421f8806b 100644 --- a/module/spl/spl-condvar.c +++ b/module/spl/spl-condvar.c @@ -135,8 +135,9 @@ EXPORT_SYMBOL(__cv_wait_interruptible); /* 'expire_time' argument is an absolute wall clock time in jiffies. * Return value is time left (expire_time - now) or -1 if timeout occurred. */ -clock_t -__cv_timedwait(kcondvar_t *cvp, kmutex_t *mp, clock_t expire_time) +static clock_t +__cv_timedwait_common(kcondvar_t *cvp, kmutex_t *mp, + clock_t expire_time, int state) { DEFINE_WAIT(wait); clock_t time_left; @@ -158,8 +159,7 @@ __cv_timedwait(kcondvar_t *cvp, kmutex_t *mp, clock_t expire_time) if (time_left <= 0) SRETURN(-1); - prepare_to_wait_exclusive(&cvp->cv_event, &wait, - TASK_UNINTERRUPTIBLE); + prepare_to_wait_exclusive(&cvp->cv_event, &wait, state); atomic_inc(&cvp->cv_waiters); /* Mutex should be dropped after prepare_to_wait() this @@ -177,8 +177,21 @@ __cv_timedwait(kcondvar_t *cvp, kmutex_t *mp, clock_t expire_time) SRETURN(time_left > 0 ? time_left : -1); } + +clock_t +__cv_timedwait(kcondvar_t *cvp, kmutex_t *mp, clock_t exp_time) +{ + return __cv_timedwait_common(cvp, mp, exp_time, TASK_UNINTERRUPTIBLE); +} EXPORT_SYMBOL(__cv_timedwait); +clock_t +__cv_timedwait_interruptible(kcondvar_t *cvp, kmutex_t *mp, clock_t exp_time) +{ + return __cv_timedwait_common(cvp, mp, exp_time, TASK_INTERRUPTIBLE); +} +EXPORT_SYMBOL(__cv_timedwait_interruptible); + void __cv_signal(kcondvar_t *cvp) { |