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