Lines Matching refs:vreq

118 #define	VREQ_DONE(vreq)							\
119 VOID2BOOLEAN(((vreq)->v_status == VREQ_DMAWIN_DONE) && \
120 (((vreq)->v_flush_diskcache == FLUSH_DISKCACHE) || \
121 (((vreq)->v_dmaw + 1) == (vreq)->v_ndmaws)))
124 #define BP_VREQ_SET(bp, vreq) (((bp)->av_back = (buf_t *)(vreq)))
278 * Alloc a vreq for this bp
279 * bp->av_back contains the pointer to the vreq upon return
284 v_req_t *vreq = NULL;
288 vreq = kmem_cache_alloc(xdf_vreq_cache, KM_NOSLEEP);
289 if (vreq == NULL) {
296 bzero(vreq, sizeof (v_req_t));
297 list_create(&vreq->v_gs, sizeof (ge_slot_t),
299 vreq->v_buf = bp;
300 vreq->v_status = VREQ_INIT;
301 vreq->v_runq = B_FALSE;
302 BP_VREQ_SET(bp, vreq);
303 /* init of other fields in vreq is up to the caller */
305 list_insert_head(&vdp->xdf_vreq_act, (void *)vreq);
307 return (vreq);
311 vreq_free(xdf_t *vdp, v_req_t *vreq)
313 buf_t *bp = vreq->v_buf;
316 ASSERT(BP_VREQ(bp) == vreq);
318 list_remove(&vdp->xdf_vreq_act, vreq);
320 if (vreq->v_flush_diskcache == FLUSH_DISKCACHE)
323 switch (vreq->v_status) {
327 (void) ddi_dma_unbind_handle(vreq->v_dmahdl);
331 ASSERT(vreq->v_abuf != NULL);
333 bcopy(vreq->v_abuf, bp->b_un.b_addr,
335 ddi_dma_mem_free(&vreq->v_align);
340 ddi_dma_free_handle(&vreq->v_memdmahdl);
343 ddi_dma_free_handle(&vreq->v_dmahdl);
349 ASSERT(!vreq->v_runq);
350 list_destroy(&vreq->v_gs);
351 kmem_cache_free(xdf_vreq_cache, vreq);
386 vreq_setup(xdf_t *vdp, v_req_t *vreq)
400 buf_t *bp = vreq->v_buf;
404 switch (vreq->v_status) {
412 vreq->v_blkno = 0;
413 vreq->v_nslots = 1;
414 vreq->v_flush_diskcache = FLUSH_DISKCACHE;
415 vreq->v_status = VREQ_GS_ALLOCED;
416 gs->gs_vreq = vreq;
417 list_insert_head(&vreq->v_gs, gs);
422 vreq->v_flush_diskcache = WRITE_BARRIER;
423 vreq->v_blkno = bp->b_blkno +
427 check_fbwrite(vdp, bp, vreq->v_blkno);
428 vreq->v_status = VREQ_INIT_DONE;
444 vreq->v_dmahdl = dh;
445 vreq->v_status = VREQ_DMAHDL_ALLOCED;
469 vreq->v_memdmahdl = mdh;
470 vreq->v_status = VREQ_MEMDMAHDL_ALLOCED;
481 rc = ddi_dma_mem_alloc(vreq->v_memdmahdl,
493 vreq->v_abuf = aba;
494 vreq->v_align = abh;
495 vreq->v_status = VREQ_DMAMEM_ALLOCED;
499 bcopy(bp->b_un.b_addr, vreq->v_abuf,
509 rc = ddi_dma_buf_bind_handle(vreq->v_dmahdl, bp,
513 rc = ddi_dma_addr_bind_handle(vreq->v_dmahdl,
514 NULL, vreq->v_abuf, bp->b_bcount, dma_flags,
520 rc = ddi_dma_numwin(vreq->v_dmahdl, &ndws);
532 vreq->v_dmac = dc;
533 vreq->v_dmaw = 0;
534 vreq->v_ndmacs = ndcs;
535 vreq->v_ndmaws = ndws;
536 vreq->v_nslots = ndws;
537 vreq->v_status = VREQ_DMABUF_BOUND;
551 vreq->v_status = VREQ_GS_ALLOCED;
552 gs->gs_vreq = vreq;
553 list_insert_head(&vreq->v_gs, gs);
564 ASSERT((vreq->v_dmaw + 1) < vreq->v_ndmaws);
573 vreq->v_dmaw++;
574 VERIFY(ddi_dma_getwin(vreq->v_dmahdl, vreq->v_dmaw, &off, &sz,
575 &vreq->v_dmac, &vreq->v_ndmacs) == DDI_SUCCESS);
576 vreq->v_status = VREQ_GS_ALLOCED;
577 gs->gs_vreq = vreq;
578 list_insert_head(&vreq->v_gs, gs);
619 v_req_t *vreq = BP_VREQ(bp);
625 if ((vreq != NULL) && vreq->v_runq) {
635 v_req_t *vreq = BP_VREQ(bp);
641 if ((vreq != NULL) && vreq->v_runq) {
651 v_req_t *vreq = BP_VREQ(bp);
654 ASSERT(!vreq->v_runq);
656 vreq->v_runq = B_TRUE;
665 v_req_t *vreq = BP_VREQ(bp);
668 ASSERT(vreq->v_runq);
670 vreq->v_runq = B_FALSE;
871 v_req_t *vreq;
881 if (((vreq = BP_VREQ(bp)) == NULL) || (!VREQ_DONE(vreq)))
894 if (((vreq = BP_VREQ(bp)) == NULL) || (!VREQ_DONE(vreq)))
906 v_req_t *vreq = gs->gs_vreq;
907 buf_t *bp = vreq->v_buf;
910 ASSERT(BP_VREQ(bp) == vreq);
916 ASSERT(vreq->v_nslots > 0);
917 if (--vreq->v_nslots > 0)
923 ASSERT(vreq->v_runq);
925 vreq->v_runq = B_FALSE;
926 vreq_free(vdp, vreq);
1079 v_req_t *vreq;
1119 while ((vreq = list_head(&vdp->xdf_vreq_act)) != NULL) {
1120 bp = vreq->v_buf;
1121 ASSERT(BP_VREQ(bp) == vreq);
1124 while ((gs = list_head(&vreq->v_gs)) != NULL)
1128 if (vreq->v_runq)
1135 vreq_free(vdp, vreq);
1237 v_req_t *vreq = BP_VREQ(bp);
1238 uint64_t blkno = vreq->v_blkno;
1239 uint_t ndmacs = vreq->v_ndmacs;
1243 ge_slot_t *gs = list_head(&vreq->v_gs);
1246 ASSERT(vreq->v_status == VREQ_GS_ALLOCED);
1251 switch (vreq->v_flush_diskcache) {
1259 vreq->v_status = VREQ_DMAWIN_DONE;
1288 bcnt = vreq->v_dmac.dmac_size;
1289 dma_addr = vreq->v_dmac.dmac_laddress;
1307 vdp->xdf_addr, seg, vreq->v_dmac.dmac_size, blk_off));
1316 ddi_dma_nextcookie(vreq->v_dmahdl, &vreq->v_dmac);
1320 vreq->v_status = VREQ_DMAWIN_DONE;
1321 vreq->v_blkno = blkno;
1334 v_req_t *vreq;
1351 /* if the buf doesn't already have a vreq, allocate one */
1352 if (((vreq = BP_VREQ(bp)) == NULL) &&
1353 ((vreq = vreq_get(vdp, bp)) == NULL))
1357 if (vreq_setup(vdp, vreq) != DDI_SUCCESS)
1370 * This buffer/vreq pair is has been allocated a ring buffer
1373 if (!vreq->v_runq)