fix loss of taskqueue wakeups (introduced in r300113)

Submitted by:	kmacy
Tested by:	dchagin
This commit is contained in:
Andriy Gapon 2016-05-21 14:51:49 +00:00
parent bb8297e6d4
commit 7107bed0f0
Notes: svn2git 2020-12-20 02:59:44 +00:00
svn path=/head/; revision=300372
3 changed files with 4 additions and 15 deletions

View File

@ -68,7 +68,6 @@ struct taskqueue {
TAILQ_HEAD(, taskqueue_busy) tq_active;
struct mtx tq_mutex;
struct thread **tq_threads;
struct thread *tq_curthread;
int tq_tcount;
int tq_spin;
int tq_flags;
@ -222,7 +221,7 @@ taskqueue_enqueue_locked(struct taskqueue *queue, struct task *task)
* Count multiple enqueues.
*/
if (task->ta_pending) {
if (task->ta_pending < UCHAR_MAX)
if (task->ta_pending < USHRT_MAX)
task->ta_pending++;
TQ_UNLOCK(queue);
return (0);
@ -465,8 +464,7 @@ taskqueue_run_locked(struct taskqueue *queue)
TQ_LOCK(queue);
tb.tb_running = NULL;
if ((task->ta_flags & TASK_SKIP_WAKEUP) == 0)
wakeup(task);
wakeup(task);
TAILQ_REMOVE(&queue->tq_active, &tb, tb_link);
tb_first = TAILQ_FIRST(&queue->tq_active);
@ -481,9 +479,7 @@ taskqueue_run(struct taskqueue *queue)
{
TQ_LOCK(queue);
queue->tq_curthread = curthread;
taskqueue_run_locked(queue);
queue->tq_curthread = NULL;
TQ_UNLOCK(queue);
}
@ -716,7 +712,6 @@ taskqueue_thread_loop(void *arg)
tq = *tqp;
taskqueue_run_callback(tq, TASKQUEUE_CALLBACK_TYPE_INIT);
TQ_LOCK(tq);
tq->tq_curthread = curthread;
while ((tq->tq_flags & TQ_FLAGS_ACTIVE) != 0) {
/* XXX ? */
taskqueue_run_locked(tq);
@ -730,7 +725,6 @@ taskqueue_thread_loop(void *arg)
TQ_SLEEP(tq, tq, &tq->tq_mutex, 0, "-", 0);
}
taskqueue_run_locked(tq);
tq->tq_curthread = NULL;
/*
* This thread is on its way out, so just drop the lock temporarily
* in order to call the shutdown callback. This allows the callback
@ -754,8 +748,7 @@ taskqueue_thread_enqueue(void *context)
tqp = context;
tq = *tqp;
if (tq->tq_curthread != curthread)
wakeup_one(tq);
wakeup_one(tq);
}
TASKQUEUE_DEFINE(swi, taskqueue_swi_enqueue, NULL,

View File

@ -45,8 +45,7 @@ typedef void task_fn_t(void *context, int pending);
struct task {
STAILQ_ENTRY(task) ta_link; /* (q) link for queue */
uint8_t ta_pending; /* (q) count times queued */
uint8_t ta_flags; /* (q) flags */
uint16_t ta_pending; /* (q) count times queued */
u_short ta_priority; /* (c) Priority */
task_fn_t *ta_func; /* (c) task handler */
void *ta_context; /* (c) argument for handler */

View File

@ -98,7 +98,6 @@ void taskqueue_set_callback(struct taskqueue *queue,
#define TASK_INITIALIZER(priority, func, context) \
{ .ta_pending = 0, \
.ta_flags = 0, \
.ta_priority = (priority), \
.ta_func = (func), \
.ta_context = (context) }
@ -114,7 +113,6 @@ void taskqueue_thread_enqueue(void *context);
*/
#define TASK_INIT(task, priority, func, context) do { \
(task)->ta_pending = 0; \
(task)->ta_flags = 0; \
(task)->ta_priority = (priority); \
(task)->ta_func = (func); \
(task)->ta_context = (context); \
@ -224,7 +222,6 @@ int taskqgroup_adjust(struct taskqgroup *qgroup, int cnt, int stride);
#define GTASK_INIT(task, priority, func, context) do { \
(task)->ta_pending = 0; \
(task)->ta_flags = TASK_SKIP_WAKEUP; \
(task)->ta_priority = (priority); \
(task)->ta_func = (func); \
(task)->ta_context = (context); \