Lines Matching refs:s
150 serializer_exec(serializer_t *s, srproc_t proc, mblk_t *mp, void *arg) in serializer_exec() argument
152 ASSERT(MUTEX_NOT_HELD(&s->ser_lock)); in serializer_exec()
153 ASSERT(s->ser_owner == curthread); in serializer_exec()
158 s->ser_curr = mp; in serializer_exec()
159 s->ser_arg = arg; in serializer_exec()
160 s->ser_proc = proc; in serializer_exec()
168 serializer_enqueue(serializer_t *s, srproc_t proc, mblk_t *mp, void *arg) in serializer_enqueue() argument
170 ASSERT(MUTEX_HELD(&s->ser_lock)); in serializer_enqueue()
172 DTRACE_PROBE4(serializer__enqueue, serializer_t *, s, in serializer_enqueue()
174 s->ser_count++; in serializer_enqueue()
177 if (s->ser_last != NULL) in serializer_enqueue()
178 s->ser_last->b_next = mp; in serializer_enqueue()
180 s->ser_first = mp; in serializer_enqueue()
181 s->ser_last = mp; in serializer_enqueue()
188 serializer_drain(serializer_t *s, int credit) in serializer_drain() argument
190 mblk_t *mp = s->ser_first; in serializer_drain()
192 ASSERT(MUTEX_HELD(&s->ser_lock)); in serializer_drain()
193 ASSERT(s->ser_owner == curthread); in serializer_drain()
195 for (; mp != NULL && credit-- != 0; mp = s->ser_first) { in serializer_drain()
199 if ((s->ser_first = s->ser_first->b_next) == NULL) { in serializer_drain()
200 s->ser_last = NULL; in serializer_drain()
204 ASSERT(s->ser_count != 0); in serializer_drain()
205 s->ser_count--; in serializer_drain()
208 mutex_exit(&s->ser_lock); in serializer_drain()
210 DTRACE_PROBE4(serializer__exec__start, serializer_t *, s, in serializer_drain()
212 serializer_exec(s, proc, mp, arg); in serializer_drain()
213 DTRACE_PROBE4(serializer__exec__end, serializer_t *, s, in serializer_drain()
216 mutex_enter(&s->ser_lock); in serializer_drain()
224 serializer_drain_completely(serializer_t *s) in serializer_drain_completely() argument
226 mutex_enter(&s->ser_lock); in serializer_drain_completely()
227 ASSERT(s->ser_taskq); in serializer_drain_completely()
228 if (s->ser_owner == NULL) { in serializer_drain_completely()
229 s->ser_owner = curthread; in serializer_drain_completely()
230 while (s->ser_first != NULL) in serializer_drain_completely()
231 serializer_drain(s, INT_MAX); in serializer_drain_completely()
232 s->ser_owner = NULL; in serializer_drain_completely()
233 s->ser_curr = NULL; in serializer_drain_completely()
234 s->ser_proc = NULL; in serializer_drain_completely()
235 s->ser_arg = NULL; in serializer_drain_completely()
237 s->ser_taskq = B_FALSE; in serializer_drain_completely()
241 cv_signal(&s->ser_cv); in serializer_drain_completely()
242 mutex_exit(&s->ser_lock); in serializer_drain_completely()
252 serializer_enter(serializer_t *s, srproc_t proc, mblk_t *mp, void *arg) in serializer_enter() argument
259 ASSERT(MUTEX_NOT_HELD(&s->ser_lock)); in serializer_enter()
261 mutex_enter(&s->ser_lock); in serializer_enter()
262 if (s->ser_owner != NULL) { in serializer_enter()
266 serializer_enqueue(s, proc, mp, arg); in serializer_enter()
274 s->ser_owner = curthread; in serializer_enter()
276 if (s->ser_first != NULL) { in serializer_enter()
277 ASSERT(s->ser_count != 0); in serializer_enter()
278 serializer_enqueue(s, proc, mp, arg); in serializer_enter()
280 ASSERT(s->ser_count == 0); in serializer_enter()
281 mutex_exit(&s->ser_lock); in serializer_enter()
286 serializer_t *, s, mblk_t *, mp, in serializer_enter()
288 serializer_exec(s, proc, mp, arg); in serializer_enter()
290 serializer_t *, s, mblk_t *, mp, in serializer_enter()
292 mutex_enter(&s->ser_lock); in serializer_enter()
300 while ((s->ser_first != NULL) && (tid == 0)) { in serializer_enter()
301 serializer_drain(s, serializer_credit); in serializer_enter()
302 if (s->ser_first != NULL) { in serializer_enter()
308 if (s->ser_taskq) { in serializer_enter()
314 s, TQ_NOSLEEP | TQ_NOQUEUE); in serializer_enter()
316 s->ser_taskq = B_TRUE; in serializer_enter()
320 s->ser_owner = NULL; in serializer_enter()
321 s->ser_curr = NULL; in serializer_enter()
322 s->ser_proc = NULL; in serializer_enter()
323 s->ser_arg = NULL; in serializer_enter()
328 cv_signal(&s->ser_cv); in serializer_enter()
329 mutex_exit(&s->ser_lock); in serializer_enter()
337 serializer_wait(serializer_t *s) in serializer_wait() argument
339 mutex_enter(&s->ser_lock); in serializer_wait()
341 ASSERT(s->ser_owner != curthread); in serializer_wait()
343 while ((s->ser_owner != NULL) || s->ser_taskq || (s->ser_first != NULL)) in serializer_wait()
344 cv_wait(&s->ser_cv, &s->ser_lock); in serializer_wait()
345 ASSERT((s->ser_first == NULL) && (s->ser_last == NULL)); in serializer_wait()
349 cv_signal(&s->ser_cv); in serializer_wait()
350 mutex_exit(&s->ser_lock); in serializer_wait()
366 serializer_destroy(serializer_t *s) in serializer_destroy() argument
368 serializer_wait(s); in serializer_destroy()
370 ASSERT(s->ser_owner == NULL); in serializer_destroy()
371 ASSERT(s->ser_taskq == 0); in serializer_destroy()
372 ASSERT(s->ser_count == 0); in serializer_destroy()
373 ASSERT(s->ser_first == NULL); in serializer_destroy()
374 ASSERT(s->ser_last == NULL); in serializer_destroy()
376 kmem_cache_free(serializer_cache, s); in serializer_destroy()
383 serializer_t *s = buf; in serializer_constructor() local
385 mutex_init(&s->ser_lock, NULL, MUTEX_DEFAULT, NULL); in serializer_constructor()
386 cv_init(&s->ser_cv, NULL, CV_DEFAULT, NULL); in serializer_constructor()
388 s->ser_taskq = 0; in serializer_constructor()
389 s->ser_count = 0; in serializer_constructor()
390 s->ser_first = s->ser_last = s->ser_curr = NULL; in serializer_constructor()
391 s->ser_proc = NULL; in serializer_constructor()
392 s->ser_arg = NULL; in serializer_constructor()
393 s->ser_owner = NULL; in serializer_constructor()
401 serializer_t *s = buf; in serializer_destructor() local
403 mutex_destroy(&s->ser_lock); in serializer_destructor()
404 cv_destroy(&s->ser_cv); in serializer_destructor()