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-head mailing list