Skip site navigation (1)Skip section navigation (2)
Date:      Fri, 28 May 2010 18:15:34 +0000 (UTC)
From:      Zachary Loafman <zml@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org
Subject:   svn commit: r208624 - head/sys/kern
Message-ID:  <201005281815.o4SIFYY4070355@svn.freebsd.org>

next in thread | raw e-mail | index | archive | help
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@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);
 	}
 }



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201005281815.o4SIFYY4070355>