svn commit: r208624 - head/sys/kern
Zachary Loafman
zml at FreeBSD.org
Fri May 28 18:15:35 UTC 2010
Author: zml
Date: Fri May 28 18:15:34 2010
New Revision: 208624
URL: http://svn.freebsd.org/changeset/base/208624
Log:
Avoid a wakeup(9) if we can be sure no one is waiting on the task.
Submitted by: Matthew Fleming <matthew.fleming at isilon.com>
Reviewed by: zml, jhb
Modified:
head/sys/kern/subr_taskqueue.c
Modified: head/sys/kern/subr_taskqueue.c
==============================================================================
--- head/sys/kern/subr_taskqueue.c Fri May 28 18:15:28 2010 (r208623)
+++ head/sys/kern/subr_taskqueue.c Fri May 28 18:15:34 2010 (r208624)
@@ -57,6 +57,7 @@ struct taskqueue {
int tq_spin;
int tq_flags;
int tq_tasks_running;
+ int tq_task_waiters;
};
#define TQ_FLAGS_ACTIVE (1 << 0)
@@ -240,7 +241,8 @@ taskqueue_run(struct taskqueue *queue)
TQ_LOCK(queue);
queue->tq_tasks_running--;
- wakeup(task);
+ if (queue->tq_task_waiters > 0)
+ wakeup(task);
}
/*
@@ -256,15 +258,21 @@ taskqueue_drain(struct taskqueue *queue,
{
if (queue->tq_spin) { /* XXX */
mtx_lock_spin(&queue->tq_mutex);
- while (task->ta_pending != 0 || queue->tq_tasks_running > 0)
+ while (task->ta_pending != 0 || queue->tq_tasks_running > 0) {
+ queue->tq_task_waiters++;
msleep_spin(task, &queue->tq_mutex, "-", 0);
+ queue->tq_task_waiters--;
+ }
mtx_unlock_spin(&queue->tq_mutex);
} else {
WITNESS_WARN(WARN_GIANTOK | WARN_SLEEPOK, NULL, __func__);
mtx_lock(&queue->tq_mutex);
- while (task->ta_pending != 0 || queue->tq_tasks_running > 0)
+ while (task->ta_pending != 0 || queue->tq_tasks_running > 0) {
+ queue->tq_task_waiters++;
msleep(task, &queue->tq_mutex, PWAIT, "-", 0);
+ queue->tq_task_waiters--;
+ }
mtx_unlock(&queue->tq_mutex);
}
}
More information about the svn-src-all
mailing list