Skip site navigation (1)Skip section navigation (2)
Date:      Tue, 24 Feb 2004 15:05:05 -0800 (PST)
From:      John Baldwin <jhb@FreeBSD.org>
To:        Perforce Change Reviews <perforce@freebsd.org>
Subject:   PERFORCE change 47597 for review
Message-ID:  <200402242305.i1ON55VL089061@repoman.freebsd.org>

next in thread | raw e-mail | index | archive | help
http://perforce.freebsd.org/chv.cgi?CH=47597

Change 47597 by jhb@jhb_slimer on 2004/02/24 15:04:09

	Import more changes that bde and myself were throwing around.

Affected files ...

.. //depot/projects/smpng/sys/kern/subr_taskqueue.c#17 edit

Differences ...

==== //depot/projects/smpng/sys/kern/subr_taskqueue.c#17 (text+ko) ====

@@ -52,7 +52,6 @@
 	const char		*tq_name;
 	taskqueue_enqueue_fn	tq_enqueue;
 	void			*tq_context;
-	int			tq_draining;
 	struct mtx		tq_mutex;
 };
 
@@ -82,7 +81,6 @@
 	queue->tq_name = name;
 	queue->tq_enqueue = enqueue;
 	queue->tq_context = context;
-	queue->tq_draining = 0;
 	mtx_init(&queue->tq_mutex, "taskqueue", NULL, MTX_DEF);
 
 	mtx_lock(&taskqueue_queues_mutex);
@@ -96,17 +94,12 @@
 taskqueue_free(struct taskqueue *queue)
 {
 
-	mtx_lock(&queue->tq_mutex);
-	KASSERT(queue->tq_draining == 0, ("free'ing a draining taskqueue"));
-	queue->tq_draining = 1;
-	mtx_unlock(&queue->tq_mutex);
-
-	taskqueue_run(queue);
-
 	mtx_lock(&taskqueue_queues_mutex);
 	STAILQ_REMOVE(&taskqueue_queues, queue, taskqueue, tq_link);
 	mtx_unlock(&taskqueue_queues_mutex);
 
+	mtx_lock(&queue->tq_mutex);
+	taskqueue_run(queue);
 	mtx_destroy(&queue->tq_mutex);
 	free(queue, M_TASKQUEUE);
 }
@@ -140,14 +133,6 @@
 	mtx_lock(&queue->tq_mutex);
 
 	/*
-	 * Don't allow new tasks on a queue which is being freed.
-	 */
-	if (queue->tq_draining) {
-		mtx_unlock(&queue->tq_mutex);
-		return EPIPE;
-	}
-
-	/*
 	 * Count multiple enqueues.
 	 */
 	if (task->ta_pending) {
@@ -188,9 +173,11 @@
 taskqueue_run(struct taskqueue *queue)
 {
 	struct task *task;
-	int pending;
+	int owned, pending;
 
-	mtx_lock(&queue->tq_mutex);
+	owned = mtx_owned(&queue->tq_mutex);
+	if (!owned)
+		mtx_lock(&queue->tq_mutex);
 	while (STAILQ_FIRST(&queue->tq_queue)) {
 		/*
 		 * Carefully remove the first task from the queue and
@@ -206,7 +193,13 @@
 
 		mtx_lock(&queue->tq_mutex);
 	}
-	mtx_unlock(&queue->tq_mutex);
+
+	/*
+	 * For compatibility, unlock on return if the queue was not locked
+	 * on entry, although this opens a race window.
+	 */
+	if (!owned)
+		mtx_unlock(&queue->tq_mutex);
 }
 
 static void
@@ -234,15 +227,13 @@
 }
 
 static void
-taskqueue_thread_loop(void *arg)
+taskqueue_thread_loop(void *dummy)
 {
+	mtx_lock(&taskqueue_thread->tq_mutex);
 	for (;;) {
-		mtx_lock(&taskqueue_thread->tq_mutex);
-		while (STAILQ_EMPTY(&taskqueue_thread->tq_queue))
-			msleep(taskqueue_thread, &taskqueue_thread->tq_mutex,
-			    PWAIT, "-", 0); 
-		mtx_unlock(&taskqueue_thread->tq_mutex);
 		taskqueue_run(taskqueue_thread);
+		msleep(taskqueue_thread, &taskqueue_thread->tq_mutex, PWAIT,
+		    "-", 0); 
 	}
 }
 
@@ -274,14 +265,6 @@
 	mtx_lock_spin(&queue->tq_mutex);
 
 	/*
-	 * Don't allow new tasks on a queue which is being freed.
-	 */
-	if (queue->tq_draining) {
-		mtx_unlock_spin(&queue->tq_mutex);
-		return EPIPE;
-	}
-
-	/*
 	 * Count multiple enqueues.
 	 */
 	if (task->ta_pending) {
@@ -361,8 +344,8 @@
 static void
 taskqueue_define_fast(void *arg)
 {
-	taskqueue_fast = malloc(sizeof(struct taskqueue),
-		M_TASKQUEUE, M_NOWAIT | M_ZERO);
+	taskqueue_fast = malloc(sizeof(struct taskqueue), M_TASKQUEUE,
+	    M_NOWAIT | M_ZERO);
 	if (!taskqueue_fast) {
 		printf("%s: Unable to allocate fast task queue!\n", __func__);
 		return;
@@ -381,4 +364,4 @@
 		NULL, SWI_TQ_FAST, 0, &taskqueue_fast_ih);
 }
 SYSINIT(taskqueue_fast, SI_SUB_CONFIGURE, SI_ORDER_SECOND,
-	taskqueue_define_fast, NULL);
+    taskqueue_define_fast, NULL);



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