Lines Matching defs:xap

53 static int xbuf_iostart(ddi_xbuf_attr_t xap);
54 static void xbuf_dispatch(ddi_xbuf_attr_t xap);
56 static void xbuf_enqueue(struct buf *bp, ddi_xbuf_attr_t xap);
113 ddi_xbuf_attr_t xap;
115 xap = kmem_zalloc(sizeof (struct __ddi_xbuf_attr), KM_SLEEP);
117 mutex_init(&xap->xa_mutex, NULL, MUTEX_DRIVER, NULL);
118 mutex_init(&xap->xa_reserve_mutex, NULL, MUTEX_DRIVER, NULL);
121 xap->xa_allocsize = max(xsize, sizeof (void *));
122 xap->xa_active_limit = active_limit;
123 xap->xa_active_lowater = xap->xa_active_limit / 2;
124 xap->xa_reserve_limit = reserve_limit;
125 xap->xa_strategy = xa_strategy;
126 xap->xa_attr_arg = attr_arg;
145 xap->xa_tq = xbuf_tq;
147 return (xap);
152 ddi_xbuf_attr_destroy(ddi_xbuf_attr_t xap)
156 mutex_destroy(&xap->xa_mutex);
157 mutex_destroy(&xap->xa_reserve_mutex);
160 while (xap->xa_reserve_count != 0) {
161 xp = xap->xa_reserve_headp;
162 xap->xa_reserve_headp = *((void **)xp);
163 xap->xa_reserve_count--;
164 kmem_free(xp, xap->xa_allocsize);
166 ASSERT(xap->xa_reserve_headp == NULL);
177 kmem_free(xap, sizeof (struct __ddi_xbuf_attr));
197 ddi_xbuf_attr_setup_brk(ddi_xbuf_attr_t xap, size_t size)
202 mutex_enter(&xap->xa_mutex);
203 xap->xa_brksize = size & ~(DEV_BSIZE - 1);
204 mutex_exit(&xap->xa_mutex);
216 ddi_xbuf_qstrategy(struct buf *bp, ddi_xbuf_attr_t xap)
218 ASSERT(xap != NULL);
219 ASSERT(!mutex_owned(&xap->xa_mutex));
220 ASSERT(!mutex_owned(&xap->xa_reserve_mutex));
222 mutex_enter(&xap->xa_mutex);
230 if (xap->xa_brksize && bp->b_bcount > xap->xa_brksize) {
237 brkp->brksize = xap->xa_brksize;
238 brkp->brkblk = btodt(xap->xa_brksize);
239 brkp->noff = xap->xa_brksize;
248 if (xap->xa_headp == NULL) {
249 xap->xa_headp = xap->xa_tailp = bp;
251 xap->xa_tailp->av_forw = bp;
252 xap->xa_tailp = bp;
256 xap->xa_pending++;
257 mutex_exit(&xap->xa_mutex);
258 return (xbuf_iostart(xap));
269 ddi_xbuf_done(struct buf *bp, ddi_xbuf_attr_t xap)
275 ASSERT(xap != NULL);
276 ASSERT(!mutex_owned(&xap->xa_mutex));
277 ASSERT(!mutex_owned(&xap->xa_reserve_mutex));
279 xp = ddi_xbuf_get(bp, xap);
281 mutex_enter(&xap->xa_mutex);
284 if (xap->xa_active_limit != 0) {
285 ASSERT(xap->xa_active_count > 0);
288 xap->xa_active_count--;
290 if (xap->xa_reserve_limit != 0) {
291 mutex_enter(&xap->xa_reserve_mutex);
292 if (xap->xa_reserve_count < xap->xa_reserve_limit) {
294 *((void **)xp) = xap->xa_reserve_headp;
295 xap->xa_reserve_headp = xp;
296 xap->xa_reserve_count++;
297 mutex_exit(&xap->xa_reserve_mutex);
300 mutex_exit(&xap->xa_reserve_mutex);
303 kmem_free(xp, xap->xa_allocsize); /* return it to the system */
310 if (brkp->active || xap->xa_headp == brkp->bp0) {
320 if ((xap->xa_active_limit == 0) ||
321 (xap->xa_active_count <= xap->xa_active_lowater)) {
322 xbuf_dispatch(xap);
325 mutex_exit(&xap->xa_mutex);
360 ddi_xbuf_dispatch(ddi_xbuf_attr_t xap)
362 mutex_enter(&xap->xa_mutex);
363 if ((xap->xa_active_limit == 0) ||
364 (xap->xa_active_count <= xap->xa_active_lowater)) {
365 xbuf_dispatch(xap);
367 mutex_exit(&xap->xa_mutex);
381 ddi_xbuf_get(struct buf *bp, ddi_xbuf_attr_t xap)
393 xbuf_iostart(ddi_xbuf_attr_t xap)
398 ASSERT(xap != NULL);
399 ASSERT(!mutex_owned(&xap->xa_mutex));
400 ASSERT(!mutex_owned(&xap->xa_reserve_mutex));
411 mutex_enter(&xap->xa_mutex);
413 if ((bp = xap->xa_headp) == NULL) {
417 if ((xap->xa_active_limit != 0) &&
418 (xap->xa_active_count >= xap->xa_active_limit)) {
426 if (xap->xa_reserve_limit != 0) {
442 mutex_enter(&xap->xa_reserve_mutex);
443 if (xap->xa_reserve_count != 0) {
444 ASSERT(xap->xa_reserve_headp != NULL);
446 xp = xap->xa_reserve_headp;
447 xap->xa_reserve_headp = *((void **)xp);
448 ASSERT(xap->xa_reserve_count > 0);
449 xap->xa_reserve_count--;
457 while (xap->xa_reserve_count <
458 xap->xa_reserve_limit) {
459 xp = kmem_alloc(xap->xa_allocsize,
464 *((void **)xp) = xap->xa_reserve_headp;
465 xap->xa_reserve_headp = xp;
466 xap->xa_reserve_count++;
469 xp = kmem_alloc(xap->xa_allocsize, KM_NOSLEEP);
471 mutex_exit(&xap->xa_reserve_mutex);
485 xp = kmem_alloc(xap->xa_allocsize, KM_NOSLEEP);
495 xap->xa_active_count++;
522 xap->xa_headp = bp0->av_forw;
528 xap->xa_headp = bp->av_forw;
540 mutex_exit(&xap->xa_mutex);
541 (*(xap->xa_strategy))(bp, xp, xap->xa_attr_arg);
544 ASSERT(xap->xa_pending > 0);
545 xap->xa_pending--;
546 mutex_exit(&xap->xa_mutex);
556 xbuf_dispatch(ddi_xbuf_attr_t xap)
558 ASSERT(xap != NULL);
559 ASSERT(xap->xa_tq != NULL);
560 ASSERT(mutex_owned(&xap->xa_mutex));
562 if ((xap->xa_headp != NULL) && (xap->xa_timeid == NULL) &&
563 (xap->xa_pending == 0)) {
569 if (taskq_dispatch(xap->xa_tq,
570 (void (*)(void *)) xbuf_iostart, xap, KM_NOSLEEP) == 0) {
576 xap->xa_timeid = timeout(xbuf_restart_callback, xap,
584 xap->xa_pending++;
593 ddi_xbuf_attr_t xap = arg;
595 ASSERT(xap != NULL);
596 ASSERT(xap->xa_tq != NULL);
597 ASSERT(!mutex_owned(&xap->xa_mutex));
599 mutex_enter(&xap->xa_mutex);
600 xap->xa_timeid = NULL;
601 xbuf_dispatch(xap);
602 mutex_exit(&xap->xa_mutex);
607 ddi_xbuf_flushq(ddi_xbuf_attr_t xap, int (*funcp)(struct buf *))
613 ASSERT(xap != NULL);
614 ASSERT(xap->xa_tq != NULL);
615 ASSERT(!mutex_owned(&xap->xa_mutex));
617 mutex_enter(&xap->xa_mutex);
619 for (bp = xap->xa_headp; bp != NULL; bp = next_bp) {
633 if (bp == xap->xa_headp) {
634 xap->xa_headp = next_bp;
635 if (xap->xa_headp == NULL) {
636 xap->xa_tailp = NULL;
639 ASSERT(xap->xa_headp != NULL);
641 if (bp == xap->xa_tailp) {
643 xap->xa_tailp = prev_bp;
650 if (xap->xa_flush_headp == NULL) {
651 ASSERT(xap->xa_flush_tailp == NULL);
652 xap->xa_flush_headp = xap->xa_flush_tailp = bp;
654 ASSERT(xap->xa_flush_tailp != NULL);
655 xap->xa_flush_tailp->av_forw = bp;
656 xap->xa_flush_tailp = bp;
660 while ((bp = xap->xa_flush_headp) != NULL) {
661 xap->xa_flush_headp = bp->av_forw;
662 if (xap->xa_flush_headp == NULL) {
663 xap->xa_flush_tailp = NULL;
665 mutex_exit(&xap->xa_mutex);
669 mutex_enter(&xap->xa_mutex);
672 mutex_exit(&xap->xa_mutex);