Lines Matching refs:tq
94 task_alloc(taskq_t *tq, int tqflags) in task_alloc() argument
99 again: if ((t = tq->tq_freelist) != NULL && tq->tq_nalloc >= tq->tq_minalloc) { in task_alloc()
100 tq->tq_freelist = t->tqent_next; in task_alloc()
102 if (tq->tq_nalloc >= tq->tq_maxalloc) { in task_alloc()
116 tq->tq_maxalloc_wait++; in task_alloc()
117 rv = cv_timedwait(&tq->tq_maxalloc_cv, in task_alloc()
118 &tq->tq_lock, ddi_get_lbolt() + hz); in task_alloc()
119 tq->tq_maxalloc_wait--; in task_alloc()
123 mutex_exit(&tq->tq_lock); in task_alloc()
127 mutex_enter(&tq->tq_lock); in task_alloc()
129 tq->tq_nalloc++; in task_alloc()
135 task_free(taskq_t *tq, taskq_ent_t *t) in task_free() argument
137 if (tq->tq_nalloc <= tq->tq_minalloc) { in task_free()
138 t->tqent_next = tq->tq_freelist; in task_free()
139 tq->tq_freelist = t; in task_free()
141 tq->tq_nalloc--; in task_free()
142 mutex_exit(&tq->tq_lock); in task_free()
144 mutex_enter(&tq->tq_lock); in task_free()
147 if (tq->tq_maxalloc_wait) in task_free()
148 cv_signal(&tq->tq_maxalloc_cv); in task_free()
152 taskq_dispatch(taskq_t *tq, task_func_t func, void *arg, uint_t tqflags) in taskq_dispatch() argument
161 mutex_enter(&tq->tq_lock); in taskq_dispatch()
162 ASSERT(tq->tq_flags & TASKQ_ACTIVE); in taskq_dispatch()
163 if ((t = task_alloc(tq, tqflags)) == NULL) { in taskq_dispatch()
164 mutex_exit(&tq->tq_lock); in taskq_dispatch()
168 t->tqent_next = tq->tq_task.tqent_next; in taskq_dispatch()
169 t->tqent_prev = &tq->tq_task; in taskq_dispatch()
171 t->tqent_next = &tq->tq_task; in taskq_dispatch()
172 t->tqent_prev = tq->tq_task.tqent_prev; in taskq_dispatch()
179 cv_signal(&tq->tq_dispatch_cv); in taskq_dispatch()
180 mutex_exit(&tq->tq_lock); in taskq_dispatch()
185 taskq_dispatch_ent(taskq_t *tq, task_func_t func, void *arg, uint_t flags, in taskq_dispatch_ent() argument
189 ASSERT(!(tq->tq_flags & TASKQ_DYNAMIC)); in taskq_dispatch_ent()
199 mutex_enter(&tq->tq_lock); in taskq_dispatch_ent()
202 t->tqent_next = tq->tq_task.tqent_next; in taskq_dispatch_ent()
203 t->tqent_prev = &tq->tq_task; in taskq_dispatch_ent()
205 t->tqent_next = &tq->tq_task; in taskq_dispatch_ent()
206 t->tqent_prev = tq->tq_task.tqent_prev; in taskq_dispatch_ent()
212 cv_signal(&tq->tq_dispatch_cv); in taskq_dispatch_ent()
213 mutex_exit(&tq->tq_lock); in taskq_dispatch_ent()
217 taskq_empty(taskq_t *tq) in taskq_empty() argument
221 mutex_enter(&tq->tq_lock); in taskq_empty()
222 rv = (tq->tq_task.tqent_next == &tq->tq_task) && (tq->tq_active == 0); in taskq_empty()
223 mutex_exit(&tq->tq_lock); in taskq_empty()
229 taskq_wait(taskq_t *tq) in taskq_wait() argument
231 mutex_enter(&tq->tq_lock); in taskq_wait()
232 while (tq->tq_task.tqent_next != &tq->tq_task || tq->tq_active != 0) in taskq_wait()
233 cv_wait(&tq->tq_wait_cv, &tq->tq_lock); in taskq_wait()
234 mutex_exit(&tq->tq_lock); in taskq_wait()
238 taskq_wait_id(taskq_t *tq, taskqid_t id __unused) in taskq_wait_id() argument
240 taskq_wait(tq); in taskq_wait_id()
246 taskq_t *tq = arg; in taskq_thread() local
250 mutex_enter(&tq->tq_lock); in taskq_thread()
251 while (tq->tq_flags & TASKQ_ACTIVE) { in taskq_thread()
252 if ((t = tq->tq_task.tqent_next) == &tq->tq_task) { in taskq_thread()
253 if (--tq->tq_active == 0) in taskq_thread()
254 cv_broadcast(&tq->tq_wait_cv); in taskq_thread()
255 cv_wait(&tq->tq_dispatch_cv, &tq->tq_lock); in taskq_thread()
256 tq->tq_active++; in taskq_thread()
264 mutex_exit(&tq->tq_lock); in taskq_thread()
266 rw_enter(&tq->tq_threadlock, RW_READER); in taskq_thread()
268 rw_exit(&tq->tq_threadlock); in taskq_thread()
270 mutex_enter(&tq->tq_lock); in taskq_thread()
272 task_free(tq, t); in taskq_thread()
274 tq->tq_nthreads--; in taskq_thread()
275 cv_broadcast(&tq->tq_wait_cv); in taskq_thread()
276 mutex_exit(&tq->tq_lock); in taskq_thread()
303 taskq_t *tq = kmem_zalloc(sizeof (taskq_t), KM_SLEEP); in taskq_create_proc() local
319 rw_init(&tq->tq_threadlock, NULL, RW_DEFAULT, NULL); in taskq_create_proc()
320 mutex_init(&tq->tq_lock, NULL, MUTEX_DEFAULT, NULL); in taskq_create_proc()
321 cv_init(&tq->tq_dispatch_cv, NULL, CV_DEFAULT, NULL); in taskq_create_proc()
322 cv_init(&tq->tq_wait_cv, NULL, CV_DEFAULT, NULL); in taskq_create_proc()
323 cv_init(&tq->tq_maxalloc_cv, NULL, CV_DEFAULT, NULL); in taskq_create_proc()
324 tq->tq_flags = flags | TASKQ_ACTIVE; in taskq_create_proc()
325 tq->tq_active = nthreads; in taskq_create_proc()
326 tq->tq_nthreads = nthreads; in taskq_create_proc()
327 tq->tq_minalloc = minalloc; in taskq_create_proc()
328 tq->tq_maxalloc = maxalloc; in taskq_create_proc()
329 tq->tq_task.tqent_next = &tq->tq_task; in taskq_create_proc()
330 tq->tq_task.tqent_prev = &tq->tq_task; in taskq_create_proc()
331 tq->tq_threadlist = kmem_alloc(nthreads * sizeof (thread_t), KM_SLEEP); in taskq_create_proc()
334 mutex_enter(&tq->tq_lock); in taskq_create_proc()
336 task_free(tq, task_alloc(tq, KM_SLEEP)); in taskq_create_proc()
337 mutex_exit(&tq->tq_lock); in taskq_create_proc()
342 tq, THR_BOUND, &tq->tq_threadlist[t]); in taskq_create_proc()
344 return (tq); in taskq_create_proc()
348 taskq_destroy(taskq_t *tq) in taskq_destroy() argument
351 int nthreads = tq->tq_nthreads; in taskq_destroy()
353 taskq_wait(tq); in taskq_destroy()
355 mutex_enter(&tq->tq_lock); in taskq_destroy()
357 tq->tq_flags &= ~TASKQ_ACTIVE; in taskq_destroy()
358 cv_broadcast(&tq->tq_dispatch_cv); in taskq_destroy()
360 while (tq->tq_nthreads != 0) in taskq_destroy()
361 cv_wait(&tq->tq_wait_cv, &tq->tq_lock); in taskq_destroy()
363 tq->tq_minalloc = 0; in taskq_destroy()
364 while (tq->tq_nalloc != 0) { in taskq_destroy()
365 ASSERT(tq->tq_freelist != NULL); in taskq_destroy()
366 task_free(tq, task_alloc(tq, KM_SLEEP)); in taskq_destroy()
369 mutex_exit(&tq->tq_lock); in taskq_destroy()
372 (void) thr_join(tq->tq_threadlist[t], NULL, NULL); in taskq_destroy()
374 kmem_free(tq->tq_threadlist, nthreads * sizeof (thread_t)); in taskq_destroy()
376 rw_destroy(&tq->tq_threadlock); in taskq_destroy()
377 mutex_destroy(&tq->tq_lock); in taskq_destroy()
378 cv_destroy(&tq->tq_dispatch_cv); in taskq_destroy()
379 cv_destroy(&tq->tq_wait_cv); in taskq_destroy()
380 cv_destroy(&tq->tq_maxalloc_cv); in taskq_destroy()
382 kmem_free(tq, sizeof (taskq_t)); in taskq_destroy()
386 taskq_member(taskq_t *tq, struct _kthread *t) in taskq_member() argument
393 for (i = 0; i < tq->tq_nthreads; i++) in taskq_member()
394 if (tq->tq_threadlist[i] == (thread_t)(uintptr_t)t) in taskq_member()