Lines Matching refs:tq

42 task_alloc(taskq_t *tq, int tqflags)  in task_alloc()  argument
47 again: if ((t = tq->tq_freelist) != NULL && tq->tq_nalloc >= tq->tq_minalloc) { in task_alloc()
49 tq->tq_freelist = t->tqent_next; in task_alloc()
51 if (tq->tq_nalloc >= tq->tq_maxalloc) { in task_alloc()
65 tq->tq_maxalloc_wait++; in task_alloc()
66 rv = cv_timedwait(&tq->tq_maxalloc_cv, in task_alloc()
67 &tq->tq_lock, ddi_get_lbolt() + hz); in task_alloc()
68 tq->tq_maxalloc_wait--; in task_alloc()
72 mutex_exit(&tq->tq_lock); in task_alloc()
76 mutex_enter(&tq->tq_lock); in task_alloc()
80 tq->tq_nalloc++; in task_alloc()
87 task_free(taskq_t *tq, taskq_ent_t *t) in task_free() argument
89 if (tq->tq_nalloc <= tq->tq_minalloc) { in task_free()
90 t->tqent_next = tq->tq_freelist; in task_free()
91 tq->tq_freelist = t; in task_free()
93 tq->tq_nalloc--; in task_free()
94 mutex_exit(&tq->tq_lock); in task_free()
96 mutex_enter(&tq->tq_lock); in task_free()
99 if (tq->tq_maxalloc_wait) in task_free()
100 cv_signal(&tq->tq_maxalloc_cv); in task_free()
104 taskq_dispatch(taskq_t *tq, task_func_t func, void *arg, uint_t tqflags) in taskq_dispatch() argument
113 mutex_enter(&tq->tq_lock); in taskq_dispatch()
114 ASSERT(tq->tq_flags & TASKQ_ACTIVE); in taskq_dispatch()
115 if ((t = task_alloc(tq, tqflags)) == NULL) { in taskq_dispatch()
116 mutex_exit(&tq->tq_lock); in taskq_dispatch()
120 t->tqent_next = tq->tq_task.tqent_next; in taskq_dispatch()
121 t->tqent_prev = &tq->tq_task; in taskq_dispatch()
123 t->tqent_next = &tq->tq_task; in taskq_dispatch()
124 t->tqent_prev = tq->tq_task.tqent_prev; in taskq_dispatch()
131 cv_signal(&tq->tq_dispatch_cv); in taskq_dispatch()
132 mutex_exit(&tq->tq_lock); in taskq_dispatch()
137 taskq_dispatch_delay(taskq_t *tq, task_func_t func, void *arg, uint_t tqflags, in taskq_dispatch_delay() argument
140 (void) tq, (void) func, (void) arg, (void) tqflags, (void) expire_time; in taskq_dispatch_delay()
161 taskq_dispatch_ent(taskq_t *tq, task_func_t func, void *arg, uint_t flags, in taskq_dispatch_ent() argument
174 mutex_enter(&tq->tq_lock); in taskq_dispatch_ent()
177 t->tqent_next = tq->tq_task.tqent_next; in taskq_dispatch_ent()
178 t->tqent_prev = &tq->tq_task; in taskq_dispatch_ent()
180 t->tqent_next = &tq->tq_task; in taskq_dispatch_ent()
181 t->tqent_prev = tq->tq_task.tqent_prev; in taskq_dispatch_ent()
187 cv_signal(&tq->tq_dispatch_cv); in taskq_dispatch_ent()
188 mutex_exit(&tq->tq_lock); in taskq_dispatch_ent()
192 taskq_wait(taskq_t *tq) in taskq_wait() argument
194 mutex_enter(&tq->tq_lock); in taskq_wait()
195 while (tq->tq_task.tqent_next != &tq->tq_task || tq->tq_active != 0) in taskq_wait()
196 cv_wait(&tq->tq_wait_cv, &tq->tq_lock); in taskq_wait()
197 mutex_exit(&tq->tq_lock); in taskq_wait()
201 taskq_wait_id(taskq_t *tq, taskqid_t id) in taskq_wait_id() argument
204 taskq_wait(tq); in taskq_wait_id()
208 taskq_wait_outstanding(taskq_t *tq, taskqid_t id) in taskq_wait_outstanding() argument
211 taskq_wait(tq); in taskq_wait_outstanding()
217 taskq_t *tq = arg; in taskq_thread() local
221 VERIFY0(pthread_setspecific(taskq_tsd, tq)); in taskq_thread()
223 mutex_enter(&tq->tq_lock); in taskq_thread()
224 while (tq->tq_flags & TASKQ_ACTIVE) { in taskq_thread()
225 if ((t = tq->tq_task.tqent_next) == &tq->tq_task) { in taskq_thread()
226 if (--tq->tq_active == 0) in taskq_thread()
227 cv_broadcast(&tq->tq_wait_cv); in taskq_thread()
228 cv_wait(&tq->tq_dispatch_cv, &tq->tq_lock); in taskq_thread()
229 tq->tq_active++; in taskq_thread()
237 mutex_exit(&tq->tq_lock); in taskq_thread()
239 rw_enter(&tq->tq_threadlock, RW_READER); in taskq_thread()
241 rw_exit(&tq->tq_threadlock); in taskq_thread()
243 mutex_enter(&tq->tq_lock); in taskq_thread()
245 task_free(tq, t); in taskq_thread()
247 tq->tq_nthreads--; in taskq_thread()
248 cv_broadcast(&tq->tq_wait_cv); in taskq_thread()
249 mutex_exit(&tq->tq_lock); in taskq_thread()
258 taskq_t *tq = kmem_zalloc(sizeof (taskq_t), KM_SLEEP); in taskq_create() local
274 rw_init(&tq->tq_threadlock, NULL, RW_DEFAULT, NULL); in taskq_create()
275 mutex_init(&tq->tq_lock, NULL, MUTEX_DEFAULT, NULL); in taskq_create()
276 cv_init(&tq->tq_dispatch_cv, NULL, CV_DEFAULT, NULL); in taskq_create()
277 cv_init(&tq->tq_wait_cv, NULL, CV_DEFAULT, NULL); in taskq_create()
278 cv_init(&tq->tq_maxalloc_cv, NULL, CV_DEFAULT, NULL); in taskq_create()
279 (void) strlcpy(tq->tq_name, name, sizeof (tq->tq_name)); in taskq_create()
280 tq->tq_flags = flags | TASKQ_ACTIVE; in taskq_create()
281 tq->tq_active = nthreads; in taskq_create()
282 tq->tq_nthreads = nthreads; in taskq_create()
283 tq->tq_minalloc = minalloc; in taskq_create()
284 tq->tq_maxalloc = maxalloc; in taskq_create()
285 tq->tq_task.tqent_next = &tq->tq_task; in taskq_create()
286 tq->tq_task.tqent_prev = &tq->tq_task; in taskq_create()
287 tq->tq_threadlist = kmem_alloc(nthreads * sizeof (kthread_t *), in taskq_create()
291 mutex_enter(&tq->tq_lock); in taskq_create()
293 task_free(tq, task_alloc(tq, KM_SLEEP)); in taskq_create()
294 mutex_exit(&tq->tq_lock); in taskq_create()
298 VERIFY((tq->tq_threadlist[t] = thread_create_named(tq->tq_name, in taskq_create()
299 NULL, 0, taskq_thread, tq, 0, &p0, TS_RUN, pri)) != NULL); in taskq_create()
301 return (tq); in taskq_create()
305 taskq_destroy(taskq_t *tq) in taskq_destroy() argument
307 int nthreads = tq->tq_nthreads; in taskq_destroy()
309 taskq_wait(tq); in taskq_destroy()
311 mutex_enter(&tq->tq_lock); in taskq_destroy()
313 tq->tq_flags &= ~TASKQ_ACTIVE; in taskq_destroy()
314 cv_broadcast(&tq->tq_dispatch_cv); in taskq_destroy()
316 while (tq->tq_nthreads != 0) in taskq_destroy()
317 cv_wait(&tq->tq_wait_cv, &tq->tq_lock); in taskq_destroy()
319 tq->tq_minalloc = 0; in taskq_destroy()
320 while (tq->tq_nalloc != 0) { in taskq_destroy()
321 ASSERT(tq->tq_freelist != NULL); in taskq_destroy()
322 taskq_ent_t *tqent_nexttq = tq->tq_freelist->tqent_next; in taskq_destroy()
323 task_free(tq, tq->tq_freelist); in taskq_destroy()
324 tq->tq_freelist = tqent_nexttq; in taskq_destroy()
327 mutex_exit(&tq->tq_lock); in taskq_destroy()
329 kmem_free(tq->tq_threadlist, nthreads * sizeof (kthread_t *)); in taskq_destroy()
331 rw_destroy(&tq->tq_threadlock); in taskq_destroy()
332 mutex_destroy(&tq->tq_lock); in taskq_destroy()
333 cv_destroy(&tq->tq_dispatch_cv); in taskq_destroy()
334 cv_destroy(&tq->tq_wait_cv); in taskq_destroy()
335 cv_destroy(&tq->tq_maxalloc_cv); in taskq_destroy()
337 kmem_free(tq, sizeof (taskq_t)); in taskq_destroy()
350 taskq_t *tq; in taskq_create_synced() local
358 tq = taskq_create(name, nthreads, minclsyspri, nthreads, INT_MAX, in taskq_create_synced()
360 VERIFY(tq != NULL); in taskq_create_synced()
361 VERIFY(tq->tq_nthreads == nthreads); in taskq_create_synced()
364 kthreads[i] = tq->tq_threadlist[i]; in taskq_create_synced()
367 return (tq); in taskq_create_synced()
371 taskq_member(taskq_t *tq, kthread_t *t) in taskq_member() argument
378 for (i = 0; i < tq->tq_nthreads; i++) in taskq_member()
379 if (tq->tq_threadlist[i] == t) in taskq_member()
392 taskq_cancel_id(taskq_t *tq, taskqid_t id) in taskq_cancel_id() argument
394 (void) tq, (void) id; in taskq_cancel_id()