aboutsummaryrefslogtreecommitdiffstats
path: root/module/spl/spl-condvar.c
diff options
context:
space:
mode:
authorNeependra Khare <[email protected]>2010-12-06 17:05:58 +0530
committerBrian Behlendorf <[email protected]>2011-01-11 12:14:48 -0800
commit3f688a8c381d298062467a318994bb5849b1c8c1 (patch)
tree9928481bcc392993b97eabdeeffac8dfa5b5485e /module/spl/spl-condvar.c
parent6bf4d76f4782a13f3ed378d77a0bc17967c3642a (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.c21
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)
{