Lines Matching refs:mmd

37  * Available as http://sac.sfbay/PSARC/2002/276/materials/mmd.pdf.
186 multidata_t *mmd;
205 mmd = (multidata_t *)(buf_info + 1);
206 mmd_mplen = sizeof (*mmd);
208 if ((*mmd_mp = desballoc((uchar_t *)mmd, mmd_mplen, BPRI_HI,
216 mmd->mmd_dp = (*mmd_mp)->b_datap;
217 mmd->mmd_hbuf = hdr_mp;
219 return (mmd);
226 mmd_addpldbuf(multidata_t *mmd, mblk_t *pld_mp)
230 ASSERT(mmd != NULL);
231 ASSERT(mmd->mmd_magic == MULTIDATA_MAGIC);
234 mutex_enter(&mmd->mmd_pd_slab_lock);
236 mmd->mmd_pbuf_cnt < MULTIDATA_MAX_PBUFS; i++) {
237 if (mmd->mmd_pbuf[i] == pld_mp) {
240 "pld 0x%p to mmd 0x%p since it has been "
242 (void *)pld_mp, (void *)mmd, i, mmd->mmd_pbuf_cnt));
243 mutex_exit(&mmd->mmd_pd_slab_lock);
245 } else if (mmd->mmd_pbuf[i] == NULL) {
246 mmd->mmd_pbuf[i] = pld_mp;
247 mmd->mmd_pbuf_cnt++;
248 mutex_exit(&mmd->mmd_pd_slab_lock);
254 MMD_DEBUG((CE_WARN, "mmd_addpldbuf: error adding pld 0x%p to mmd 0x%p "
256 (void *)mmd, mmd->mmd_pbuf_cnt, MULTIDATA_MAX_PBUFS));
257 mutex_exit(&mmd->mmd_pd_slab_lock);
270 multidata_t *mmd;
278 mmd = (multidata_t *)(buf_info + 1);
279 mmd->mmd_magic = MULTIDATA_MAGIC;
281 mutex_init(&(mmd->mmd_pd_slab_lock), NULL, MUTEX_DRIVER, NULL);
282 QL_INIT(&(mmd->mmd_pd_slab_q));
283 QL_INIT(&(mmd->mmd_pd_q));
295 multidata_t *mmd;
300 mmd = (multidata_t *)((uchar_t *)buf + sizeof (struct mmd_buf_info));
302 ASSERT(mmd->mmd_magic == MULTIDATA_MAGIC);
303 ASSERT(mmd->mmd_dp == NULL);
304 ASSERT(mmd->mmd_hbuf == NULL);
305 ASSERT(mmd->mmd_pbuf_cnt == 0);
308 ASSERT(mmd->mmd_pbuf[i] == NULL);
310 ASSERT(mmd->mmd_pattbl == NULL);
312 mutex_destroy(&(mmd->mmd_pd_slab_lock));
313 ASSERT(mmd->mmd_pd_slab_q.ql_next == &(mmd->mmd_pd_slab_q));
314 ASSERT(mmd->mmd_slab_cnt == 0);
315 ASSERT(mmd->mmd_pd_q.ql_next == &(mmd->mmd_pd_q));
316 ASSERT(mmd->mmd_pd_cnt == 0);
317 ASSERT(mmd->mmd_hbuf_ref == 0);
318 ASSERT(mmd->mmd_pbuf_ref == 0);
327 multidata_t *mmd;
335 mmd = (multidata_t *)(buf + sizeof (struct mmd_buf_info));
336 ASSERT(mmd->mmd_magic == MULTIDATA_MAGIC);
338 ASSERT(mmd->mmd_dp != NULL);
339 ASSERT(mmd->mmd_dp->db_ref == 1);
342 pd = Q2PD(mmd->mmd_pd_q.ql_next);
343 while (pd != Q2PD(&(mmd->mmd_pd_q)))
344 pd = mmd_destroy_pdesc(mmd, pd);
346 ASSERT(mmd->mmd_pd_q.ql_next == &(mmd->mmd_pd_q));
347 ASSERT(mmd->mmd_pd_cnt == 0);
348 ASSERT(mmd->mmd_hbuf_ref == 0);
349 ASSERT(mmd->mmd_pbuf_ref == 0);
352 if (mmd->mmd_pattbl != NULL)
353 mmd_destroy_pattbl(&(mmd->mmd_pattbl));
356 slab = Q2PDSLAB(mmd->mmd_pd_slab_q.ql_next);
357 while (slab != Q2PDSLAB(&(mmd->mmd_pd_slab_q))) {
367 ASSERT(mmd->mmd_slab_cnt > 0);
368 mmd->mmd_slab_cnt--;
371 ASSERT(mmd->mmd_pd_slab_q.ql_next == &(mmd->mmd_pd_slab_q));
372 ASSERT(mmd->mmd_slab_cnt == 0);
374 mmd->mmd_dp = NULL;
377 if (mmd->mmd_hbuf != NULL) {
378 freeb(mmd->mmd_hbuf);
379 mmd->mmd_hbuf = NULL;
383 if (mmd->mmd_pbuf[i] != NULL) {
384 freeb(mmd->mmd_pbuf[i]);
385 mmd->mmd_pbuf[i] = NULL;
386 ASSERT(mmd->mmd_pbuf_cnt > 0);
387 mmd->mmd_pbuf_cnt--;
391 ASSERT(mmd->mmd_pbuf_cnt == 0);
392 ASSERT(MUTEX_NOT_HELD(&(mmd->mmd_pd_slab_lock)));
406 multidata_t *mmd, *n_mmd;
424 mmd = mmd_getmultidata(bp);
427 if (mmd->mmd_hbuf != NULL && (n_hbuf = copyb(mmd->mmd_hbuf)) == NULL)
431 mutex_enter(&mmd->mmd_pd_slab_lock);
433 n_pbuf_cnt = mmd->mmd_pbuf_cnt;
435 ASSERT(mmd->mmd_pbuf[i] != NULL);
436 n_pbuf[i] = copyb(mmd->mmd_pbuf[i]);
439 mutex_exit(&mmd->mmd_pd_slab_lock);
451 mutex_exit(&mmd->mmd_pd_slab_lock);
466 mutex_exit(&mmd->mmd_pd_slab_lock);
472 if (mmd->mmd_pattbl != NULL &&
473 mmd_copy_pattbl(mmd->mmd_pattbl, n_mmd, NULL, kmflags) < 0) {
475 mutex_exit(&mmd->mmd_pd_slab_lock);
480 pd = mmd_getpdesc(mmd, NULL, NULL, 1, B_TRUE); /* first pdesc */
507 base = mmd->mmd_hbuf->b_rptr;
524 ASSERT(mmd->mmd_pbuf[idx] != NULL);
527 base = mmd->mmd_pbuf[idx]->b_rptr;
550 mutex_exit(&mmd->mmd_pd_slab_lock);
559 mutex_exit(&mmd->mmd_pd_slab_lock);
569 multidata_t *mmd;
576 mmd = (multidata_t *)mp->b_rptr;
577 ASSERT(mmd->mmd_magic == MULTIDATA_MAGIC);
579 return (mmd);
586 mmd_getregions(multidata_t *mmd, mbufinfo_t *mbi)
590 ASSERT(mmd != NULL);
591 ASSERT(mmd->mmd_magic == MULTIDATA_MAGIC);
596 if (mmd->mmd_hbuf != NULL) {
597 mbi->hbuf_rptr = mmd->mmd_hbuf->b_rptr;
598 mbi->hbuf_wptr = mmd->mmd_hbuf->b_wptr;
601 mutex_enter(&mmd->mmd_pd_slab_lock);
602 for (i = 0; i < mmd->mmd_pbuf_cnt; i++) {
603 ASSERT(mmd->mmd_pbuf[i] != NULL);
604 mbi->pbuf_ary[i].pbuf_rptr = mmd->mmd_pbuf[i]->b_rptr;
605 mbi->pbuf_ary[i].pbuf_wptr = mmd->mmd_pbuf[i]->b_wptr;
608 mbi->pbuf_cnt = mmd->mmd_pbuf_cnt;
609 mutex_exit(&mmd->mmd_pd_slab_lock);
616 mmd_getcnt(multidata_t *mmd, uint_t *hbuf_ref, uint_t *pbuf_ref)
620 ASSERT(mmd != NULL);
621 ASSERT(mmd->mmd_magic == MULTIDATA_MAGIC);
623 mutex_enter(&(mmd->mmd_pd_slab_lock));
625 *hbuf_ref = mmd->mmd_hbuf_ref;
627 *pbuf_ref = mmd->mmd_pbuf_ref;
628 pd_cnt = mmd->mmd_pd_cnt;
629 mutex_exit(&(mmd->mmd_pd_slab_lock));
634 #define HBUF_REF_VALID(mmd, pdi) \
635 ((mmd)->mmd_hbuf != NULL && (pdi)->hdr_rptr != NULL && \
641 (pdi)->hdr_base >= (mmd)->mmd_hbuf->b_rptr && \
642 MBLKIN((mmd)->mmd_hbuf, \
643 (pdi->hdr_base - (mmd)->mmd_hbuf->b_rptr), \
650 pbuf_ref_valid(multidata_t *mmd, pdescinfo_t *pdi)
656 mutex_enter(&mmd->mmd_pd_slab_lock);
657 if (pdi->pld_cnt == 0 || pdi->pld_cnt > mmd->mmd_pbuf_cnt) {
658 mutex_exit(&mmd->mmd_pd_slab_lock);
664 valid = (((idx = pa->pld_pbuf_idx) < mmd->mmd_pbuf_cnt) &&
667 pa->pld_rptr >= mmd->mmd_pbuf[idx]->b_rptr &&
668 MBLKIN(mmd->mmd_pbuf[idx], (pa->pld_rptr -
669 mmd->mmd_pbuf[idx]->b_rptr),
679 i, pdi->pld_cnt, idx, mmd->mmd_pbuf_cnt,
683 (void *)mmd->mmd_pbuf[idx]->b_rptr,
684 (void *)mmd->mmd_pbuf[idx]->b_wptr,
685 (int)MBLKL(mmd->mmd_pbuf[idx])));
693 mutex_exit(&mmd->mmd_pd_slab_lock);
701 mmd_addpdesc(multidata_t *mmd, pdescinfo_t *pdi, int *err, int kmflags)
703 ASSERT(mmd != NULL);
704 ASSERT(mmd->mmd_magic == MULTIDATA_MAGIC);
710 (((pdi->flags & PDESC_HBUF_REF) && !HBUF_REF_VALID(mmd, pdi)) ||
711 ((pdi->flags & PDESC_PBUF_REF) && !pbuf_ref_valid(mmd, pdi)))) {
717 return (mmd_addpdesc_int(mmd, pdi, err, kmflags));
725 mmd_addpdesc_int(multidata_t *mmd, pdescinfo_t *pdi, int *err, int kmflags)
731 ASSERT(!(pdi->flags & PDESC_HBUF_REF) || HBUF_REF_VALID(mmd, pdi));
732 ASSERT(!(pdi->flags & PDESC_PBUF_REF) || pbuf_ref_valid(mmd, pdi));
737 mutex_enter(&(mmd->mmd_pd_slab_lock));
743 slab_last = Q2PDSLAB(mmd->mmd_pd_slab_q.ql_prev);
744 if (mmd->mmd_pd_slab_q.ql_next == &(mmd->mmd_pd_slab_q) ||
750 mutex_exit(&(mmd->mmd_pd_slab_lock));
753 slab->pds_mmd = mmd;
759 insque(&(slab->pds_next), mmd->mmd_pd_slab_q.ql_prev);
760 mmd->mmd_slab_cnt++;
776 mmd->mmd_hbuf_ref++;
778 mmd->mmd_pbuf_ref += pd->pd_pdi.pld_cnt;
779 mmd->mmd_pd_cnt++;
782 insque(&(pd->pd_next), mmd->mmd_pd_q.ql_prev);
783 mutex_exit(&(mmd->mmd_pd_slab_lock));
837 mmd_destroy_pdesc(multidata_t *mmd, pdesc_t *pd)
851 ASSERT(mmd->mmd_hbuf_ref > 0);
852 mmd->mmd_hbuf_ref--;
855 ASSERT(mmd->mmd_pbuf_ref > 0);
856 mmd->mmd_pbuf_ref -= pd->pd_pdi.pld_cnt;
858 ASSERT(mmd->mmd_pd_cnt > 0);
859 mmd->mmd_pd_cnt--;
870 multidata_t *mmd;
875 mmd = pd->pd_slab->pds_mmd;
876 ASSERT(mmd->mmd_magic == MULTIDATA_MAGIC);
878 mutex_enter(&(mmd->mmd_pd_slab_lock));
886 if (mmd->mmd_dp->db_ref > 1) {
889 ASSERT(mmd->mmd_hbuf_ref > 0);
890 mmd->mmd_hbuf_ref--;
893 ASSERT(mmd->mmd_pbuf_ref > 0);
894 mmd->mmd_pbuf_ref -= pd->pd_pdi.pld_cnt;
896 ASSERT(mmd->mmd_pd_cnt > 0);
897 mmd->mmd_pd_cnt--;
899 (void) mmd_destroy_pdesc(mmd, pd);
901 mutex_exit(&(mmd->mmd_pd_slab_lock));
908 mmd_getpdesc(multidata_t *mmd, pdesc_t *pd, pdescinfo_t *pdi, uint_t forw,
913 ASSERT(pd == NULL || pd->pd_slab->pds_mmd == mmd);
914 ASSERT(mmd->mmd_magic == MULTIDATA_MAGIC);
915 ASSERT(!mutex_held || MUTEX_HELD(&(mmd->mmd_pd_slab_lock)));
918 mutex_enter(&(mmd->mmd_pd_slab_lock));
919 pd_head = Q2PD(&(mmd->mmd_pd_q));
926 pd = forw ? Q2PD(mmd->mmd_pd_q.ql_next) :
927 Q2PD(mmd->mmd_pd_q.ql_prev);
943 mutex_exit(&(mmd->mmd_pd_slab_lock));
962 mmd_getfirstpdesc(multidata_t *mmd, pdescinfo_t *pdi)
964 return (mmd_getpdesc(mmd, NULL, pdi, 1, B_FALSE));
971 mmd_getlastpdesc(multidata_t *mmd, pdescinfo_t *pdi)
973 return (mmd_getpdesc(mmd, NULL, pdi, 0, B_FALSE));
1035 multidata_t *mmd;
1042 mmd = pd->pd_slab->pds_mmd;
1043 ASSERT(mmd->mmd_magic == MULTIDATA_MAGIC);
1055 (((pdi->flags & PDESC_HBUF_REF) && !HBUF_REF_VALID(mmd, pdi)) ||
1056 ((pdi->flags & PDESC_PBUF_REF) && !pbuf_ref_valid(mmd, pdi))))
1079 multidata_t *mmd;
1088 mmd = pd->pd_slab->pds_mmd;
1089 ASSERT(mmd->mmd_magic == MULTIDATA_MAGIC);
1095 mutex_enter(&mmd->mmd_pd_slab_lock);
1107 mutex_exit(&mmd->mmd_pd_slab_lock);
1129 mutex_exit(&mmd->mmd_pd_slab_lock);
1139 multidata_t *mmd;
1146 mmd = pd->pd_slab->pds_mmd;
1147 ASSERT(mmd->mmd_magic == MULTIDATA_MAGIC);
1157 if ((nmp = dupb(mmd->mmd_hbuf)) == NULL)
1169 mutex_enter(&mmd->mmd_pd_slab_lock);
1171 ASSERT(mmd->mmd_pbuf[pa->pld_pbuf_idx] != NULL);
1177 mp = dupb(mmd->mmd_pbuf[pa->pld_pbuf_idx]);
1181 mutex_exit(&mmd->mmd_pd_slab_lock);
1191 mutex_exit(&mmd->mmd_pd_slab_lock);
1201 mmd_dupbufs(multidata_t *mmd, mblk_t **hmp, mblk_t **pmp)
1203 ASSERT(mmd != NULL);
1204 ASSERT(mmd->mmd_magic == MULTIDATA_MAGIC);
1208 if (mmd->mmd_hbuf != NULL &&
1209 (*hmp = dupb(mmd->mmd_hbuf)) == NULL)
1217 mutex_enter(&mmd->mmd_pd_slab_lock);
1219 for (i = 0; i < mmd->mmd_pbuf_cnt; i++) {
1220 ASSERT(mmd->mmd_pbuf[i] != NULL);
1221 mp = dupb(mmd->mmd_pbuf[i]);
1227 mutex_exit(&mmd->mmd_pd_slab_lock);
1235 mutex_exit(&mmd->mmd_pd_slab_lock);
1268 mmd_addpattr(multidata_t *mmd, pdesc_t *pd, pattrinfo_t *pai,
1277 ASSERT(mmd != NULL);
1278 ASSERT(mmd->mmd_magic == MULTIDATA_MAGIC);
1283 tbl_p = pd != NULL ? &(pd->pd_pattbl) : &(mmd->mmd_pattbl);
1314 pa->pat_mmd = mmd;
1523 mmd_getpattr(multidata_t *mmd, pdesc_t *pd, pattrinfo_t *pai)
1528 ASSERT(mmd != NULL);
1529 ASSERT(mmd->mmd_magic == MULTIDATA_MAGIC);
1533 tbl = pd != NULL ? pd->pd_pattbl : mmd->mmd_pattbl;
1557 mmd_getsize(multidata_t *mmd, uint_t *ptotal, uint_t *pinuse)
1563 ASSERT(mmd != NULL);
1564 ASSERT(mmd->mmd_magic == MULTIDATA_MAGIC);
1566 mutex_enter(&mmd->mmd_pd_slab_lock);
1570 if (mmd->mmd_hbuf != NULL)
1571 *ptotal += MBLKL(mmd->mmd_hbuf);
1573 for (i = 0; i < mmd->mmd_pbuf_cnt; i++) {
1574 ASSERT(mmd->mmd_pbuf[i] != NULL);
1575 *ptotal += MBLKL(mmd->mmd_pbuf[i]);
1582 pd = mmd_getpdesc(mmd, NULL, NULL, 1, B_TRUE);
1587 pd = mmd_getpdesc(mmd, pd, NULL, 1, B_TRUE);
1602 mutex_exit(&mmd->mmd_pd_slab_lock);