summaryrefslogtreecommitdiffstats
path: root/sys/kern/subr_taskqueue.c
diff options
context:
space:
mode:
authorzml <zml@FreeBSD.org>2010-06-01 16:04:01 +0000
committerzml <zml@FreeBSD.org>2010-06-01 16:04:01 +0000
commit7f5d6a35d6fa3ee4e0f0629aa54dbe3c7549b664 (patch)
tree800e1d5d39c5d5001f0b0a56fa9d521ea7616317 /sys/kern/subr_taskqueue.c
parentab54fd079f3a491799640409cffd4fd999b59303 (diff)
downloadFreeBSD-src-7f5d6a35d6fa3ee4e0f0629aa54dbe3c7549b664.zip
FreeBSD-src-7f5d6a35d6fa3ee4e0f0629aa54dbe3c7549b664.tar.gz
Revert taskqueue(9) related commits until mdf@ is approved and can
resolve issues. This reverts commits r207439, r208623, r208624
Diffstat (limited to 'sys/kern/subr_taskqueue.c')
-rw-r--r--sys/kern/subr_taskqueue.c20
1 files changed, 6 insertions, 14 deletions
diff --git a/sys/kern/subr_taskqueue.c b/sys/kern/subr_taskqueue.c
index b06678c..8405b3d 100644
--- a/sys/kern/subr_taskqueue.c
+++ b/sys/kern/subr_taskqueue.c
@@ -51,13 +51,12 @@ struct taskqueue {
const char *tq_name;
taskqueue_enqueue_fn tq_enqueue;
void *tq_context;
+ struct task *tq_running;
struct mtx tq_mutex;
struct thread **tq_threads;
int tq_tcount;
int tq_spin;
int tq_flags;
- int tq_tasks_running;
- int tq_task_waiters;
};
#define TQ_FLAGS_ACTIVE (1 << 0)
@@ -234,15 +233,14 @@ taskqueue_run(struct taskqueue *queue)
STAILQ_REMOVE_HEAD(&queue->tq_queue, ta_link);
pending = task->ta_pending;
task->ta_pending = 0;
- queue->tq_tasks_running++;
+ queue->tq_running = task;
TQ_UNLOCK(queue);
task->ta_func(task->ta_context, pending);
TQ_LOCK(queue);
- queue->tq_tasks_running--;
- if (queue->tq_task_waiters > 0)
- wakeup(task);
+ queue->tq_running = NULL;
+ wakeup(task);
}
/*
@@ -258,21 +256,15 @@ taskqueue_drain(struct taskqueue *queue, struct task *task)
{
if (queue->tq_spin) { /* XXX */
mtx_lock_spin(&queue->tq_mutex);
- while (task->ta_pending != 0 || queue->tq_tasks_running > 0) {
- queue->tq_task_waiters++;
+ while (task->ta_pending != 0 || task == queue->tq_running)
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) {
- queue->tq_task_waiters++;
+ while (task->ta_pending != 0 || task == queue->tq_running)
msleep(task, &queue->tq_mutex, PWAIT, "-", 0);
- queue->tq_task_waiters--;
- }
mtx_unlock(&queue->tq_mutex);
}
}
OpenPOWER on IntegriCloud