svn commit: r216787 - in projects/ofed/head/sys: kern sys

Jeff Roberson jeff at FreeBSD.org
Wed Dec 29 04:14:25 UTC 2010


Author: jeff
Date: Wed Dec 29 04:14:24 2010
New Revision: 216787
URL: http://svn.freebsd.org/changeset/base/216787

Log:
   - Add a wait argument to taskqueue_cancel() so it can be used for blocking
     and non-blocking operations.
  
  Sponsored by:	Isilon Systems, iX Systems, and Panasas.

Modified:
  projects/ofed/head/sys/kern/subr_taskqueue.c
  projects/ofed/head/sys/sys/taskqueue.h

Modified: projects/ofed/head/sys/kern/subr_taskqueue.c
==============================================================================
--- projects/ofed/head/sys/kern/subr_taskqueue.c	Wed Dec 29 02:54:41 2010	(r216786)
+++ projects/ofed/head/sys/kern/subr_taskqueue.c	Wed Dec 29 04:14:24 2010	(r216787)
@@ -251,10 +251,12 @@ taskqueue_run(struct taskqueue *queue)
 }
 
 int
-taskqueue_cancel(struct taskqueue *queue, struct task *task)
+taskqueue_cancel(struct taskqueue *queue, struct task *task, int wait)
 {
 	int pending;
 
+	if (wait)
+		WITNESS_WARN(WARN_GIANTOK | WARN_SLEEPOK, NULL, __func__);
 	if (queue->tq_spin) {		/* XXX */
 		mtx_lock_spin(&queue->tq_mutex);
 		pending = task->ta_pending;
@@ -264,12 +266,11 @@ taskqueue_cancel(struct taskqueue *queue
 				    task, ta_link);
 				task->ta_pending = 0;
 				break;
-			} else
+			} else if (wait)
 				msleep_spin(task, &queue->tq_mutex, "-", 0);
 		}
 		mtx_unlock_spin(&queue->tq_mutex);
 	} else {
-		WITNESS_WARN(WARN_GIANTOK | WARN_SLEEPOK, NULL, __func__);
 
 		mtx_lock(&queue->tq_mutex);
 		pending = task->ta_pending;
@@ -279,7 +280,7 @@ taskqueue_cancel(struct taskqueue *queue
 				    task, ta_link);
 				task->ta_pending = 0;
 				break;
-			} else
+			} else if (wait)
 				msleep(task, &queue->tq_mutex, PWAIT, "-", 0);
 		}
 		mtx_unlock(&queue->tq_mutex);

Modified: projects/ofed/head/sys/sys/taskqueue.h
==============================================================================
--- projects/ofed/head/sys/sys/taskqueue.h	Wed Dec 29 02:54:41 2010	(r216786)
+++ projects/ofed/head/sys/sys/taskqueue.h	Wed Dec 29 04:14:24 2010	(r216787)
@@ -54,7 +54,7 @@ struct taskqueue *taskqueue_create(const
 int	taskqueue_start_threads(struct taskqueue **tqp, int count, int pri,
 				const char *name, ...) __printflike(4, 5);
 int	taskqueue_enqueue(struct taskqueue *queue, struct task *task);
-int	taskqueue_cancel(struct taskqueue *queue, struct task *task);
+int	taskqueue_cancel(struct taskqueue *queue, struct task *task, int wait);
 void	taskqueue_drain(struct taskqueue *queue, struct task *task);
 void	taskqueue_free(struct taskqueue *queue);
 void	taskqueue_run(struct taskqueue *queue);


More information about the svn-src-projects mailing list