Lines Matching defs:tq
147 struct taskq *tq;
149 tq = malloc(sizeof(*tq), M_DEVBUF, M_WAITOK);
150 if (tq == NULL)
153 tq->tq_state = TQ_S_CREATED;
154 tq->tq_running = 0;
155 tq->tq_nthreads = nthreads;
156 tq->tq_name = name;
157 tq->tq_flags = flags;
159 mtx_init_flags(&tq->tq_mtx, ipl, name, 0);
160 TAILQ_INIT(&tq->tq_worklist);
162 SLIST_INIT(&tq->tq_threads);
163 tq->tq_barriers = 0;
164 tq->tq_bgen = 0;
165 tq->tq_bthreads = 0;
168 memset(&tq->tq_lock_object, 0, sizeof(tq->tq_lock_object));
169 tq->tq_lock_object.lo_name = name;
170 tq->tq_lock_object.lo_flags = TASKQ_LOCK_FLAGS;
171 witness_init(&tq->tq_lock_object, &taskq_lock_type);
175 kthread_create_deferred(taskq_create_thread, tq);
177 return (tq);
181 taskq_destroy(struct taskq *tq)
183 mtx_enter(&tq->tq_mtx);
184 switch (tq->tq_state) {
186 /* tq is still referenced by taskq_create_thread */
187 tq->tq_state = TQ_S_DESTROYED;
188 mtx_leave(&tq->tq_mtx);
192 tq->tq_state = TQ_S_DESTROYED;
196 panic("unexpected %s tq state %u", tq->tq_name, tq->tq_state);
199 while (tq->tq_running > 0) {
200 wakeup(tq);
201 msleep_nsec(&tq->tq_running, &tq->tq_mtx, PWAIT, "tqdestroy",
204 mtx_leave(&tq->tq_mtx);
206 free(tq, M_DEVBUF, sizeof(*tq));
212 struct taskq *tq = arg;
215 mtx_enter(&tq->tq_mtx);
217 switch (tq->tq_state) {
219 mtx_leave(&tq->tq_mtx);
220 free(tq, M_DEVBUF, sizeof(*tq));
224 tq->tq_state = TQ_S_RUNNING;
228 panic("unexpected %s tq state %d", tq->tq_name, tq->tq_state);
232 tq->tq_running++;
233 mtx_leave(&tq->tq_mtx);
235 rv = kthread_create(taskq_thread, tq, NULL, tq->tq_name);
237 mtx_enter(&tq->tq_mtx);
240 tq->tq_name);
242 tq->tq_running--;
244 if (tq->tq_state == TQ_S_DESTROYED &&
245 tq->tq_running == 0)
246 wakeup_one(&tq->tq_running);
249 } while (tq->tq_running < tq->tq_nthreads);
251 mtx_leave(&tq->tq_mtx);
257 struct taskq *tq = p;
260 mtx_enter(&tq->tq_mtx);
261 tq->tq_bthreads++;
262 wakeup(&tq->tq_bthreads);
264 gen = tq->tq_bgen;
266 msleep_nsec(&tq->tq_bgen, &tq->tq_mtx,
268 } while (gen == tq->tq_bgen);
269 mtx_leave(&tq->tq_mtx);
273 taskq_do_barrier(struct taskq *tq)
275 struct task t = TASK_INITIALIZER(taskq_barrier_task, tq);
279 mtx_enter(&tq->tq_mtx);
280 tq->tq_barriers++;
283 SLIST_FOREACH(tt, &tq->tq_threads, tt_entry) {
285 tq->tq_bthreads++;
286 wakeup(&tq->tq_bthreads);
291 while (tq->tq_bthreads < tq->tq_nthreads) {
294 TAILQ_INSERT_TAIL(&tq->tq_worklist, &t, t_entry);
295 wakeup_one(tq);
297 msleep_nsec(&tq->tq_bthreads, &tq->tq_mtx,
305 TAILQ_REMOVE(&tq->tq_worklist, &t, t_entry);
308 if (--tq->tq_barriers == 0) {
310 tq->tq_bgen++;
311 wakeup(&tq->tq_bgen);
312 tq->tq_bthreads = 0;
314 unsigned int gen = tq->tq_bgen;
316 msleep_nsec(&tq->tq_bgen, &tq->tq_mtx,
318 } while (gen == tq->tq_bgen);
320 mtx_leave(&tq->tq_mtx);
324 taskq_barrier(struct taskq *tq)
326 WITNESS_CHECKORDER(&tq->tq_lock_object, LOP_NEWORDER, NULL);
328 taskq_do_barrier(tq);
332 taskq_del_barrier(struct taskq *tq, struct task *t)
334 WITNESS_CHECKORDER(&tq->tq_lock_object, LOP_NEWORDER, NULL);
336 task_del(tq, t);
337 taskq_do_barrier(tq);
349 task_add(struct taskq *tq, struct task *w)
356 mtx_enter(&tq->tq_mtx);
360 TAILQ_INSERT_TAIL(&tq->tq_worklist, w, t_entry);
366 mtx_leave(&tq->tq_mtx);
369 wakeup_one(tq);
375 task_del(struct taskq *tq, struct task *w)
382 mtx_enter(&tq->tq_mtx);
386 TAILQ_REMOVE(&tq->tq_worklist, w, t_entry);
388 mtx_leave(&tq->tq_mtx);
394 taskq_next_work(struct taskq *tq, struct task *work)
398 mtx_enter(&tq->tq_mtx);
399 while ((next = TAILQ_FIRST(&tq->tq_worklist)) == NULL) {
400 if (tq->tq_state != TQ_S_RUNNING) {
401 mtx_leave(&tq->tq_mtx);
405 msleep_nsec(tq, &tq->tq_mtx, PWAIT, "bored", INFSLP);
408 TAILQ_REMOVE(&tq->tq_worklist, next, t_entry);
413 next = TAILQ_FIRST(&tq->tq_worklist);
414 mtx_leave(&tq->tq_mtx);
416 if (next != NULL && tq->tq_nthreads > 1)
417 wakeup_one(tq);
426 struct taskq *tq = xtq;
430 if (ISSET(tq->tq_flags, TASKQ_MPSAFE))
433 mtx_enter(&tq->tq_mtx);
434 SLIST_INSERT_HEAD(&tq->tq_threads, &self, tt_entry);
435 mtx_leave(&tq->tq_mtx);
437 WITNESS_CHECKORDER(&tq->tq_lock_object, LOP_NEWORDER, NULL);
439 while (taskq_next_work(tq, &work)) {
440 WITNESS_LOCK(&tq->tq_lock_object, 0);
448 WITNESS_UNLOCK(&tq->tq_lock_object, 0);
452 mtx_enter(&tq->tq_mtx);
453 SLIST_REMOVE(&tq->tq_threads, &self, taskq_thread, tt_entry);
454 last = (--tq->tq_running == 0);
455 mtx_leave(&tq->tq_mtx);
457 if (ISSET(tq->tq_flags, TASKQ_MPSAFE))
461 wakeup_one(&tq->tq_running);