Lines Matching refs:sg

66 #define	SGLIST_SAVE(sg, sgsave) do {					\
67 (sgsave).sg_nseg = (sg)->sg_nseg; \
69 (sgsave).ss_len = (sg)->sg_segs[(sgsave).sg_nseg - 1].ss_len; \
74 #define SGLIST_RESTORE(sg, sgsave) do { \
75 (sg)->sg_nseg = (sgsave).sg_nseg; \
77 (sg)->sg_segs[(sgsave).sg_nseg - 1].ss_len = (sgsave).ss_len; \
81 * Append a single (paddr, len) to a sglist. sg is the list and ss is
86 _sglist_append_range(struct sglist *sg, struct sglist_seg **ssp,
95 if (sg->sg_nseg == sg->sg_maxseg)
100 sg->sg_nseg++;
111 _sglist_append_buf(struct sglist *sg, void *buf, size_t len, pmap_t pmap,
133 if (sg->sg_nseg == 0) {
134 ss = sg->sg_segs;
137 sg->sg_nseg = 1;
139 ss = &sg->sg_segs[sg->sg_nseg - 1];
140 error = _sglist_append_range(sg, &ss, paddr, seglen);
155 error = _sglist_append_range(sg, &ss, paddr, seglen);
286 struct sglist *sg;
288 sg = malloc(sizeof(struct sglist) + nsegs * sizeof(struct sglist_seg),
290 if (sg == NULL)
292 sglist_init(sg, nsegs, (struct sglist_seg *)(sg + 1));
293 return (sg);
300 sglist_free(struct sglist *sg)
303 if (sg == NULL)
306 if (refcount_release(&sg->sg_refs))
307 free(sg, M_SGLIST);
316 sglist_append(struct sglist *sg, void *buf, size_t len)
321 if (sg->sg_maxseg == 0)
323 SGLIST_SAVE(sg, save);
324 error = _sglist_append_buf(sg, buf, len, NULL, NULL);
326 SGLIST_RESTORE(sg, save);
337 sglist_append_bio(struct sglist *sg, struct bio *bp)
342 error = sglist_append(sg, bp->bio_data, bp->bio_bcount);
344 error = sglist_append_vmpages(sg, bp->bio_ma,
354 sglist_append_phys(struct sglist *sg, vm_paddr_t paddr, size_t len)
360 if (sg->sg_maxseg == 0)
365 if (sg->sg_nseg == 0) {
366 sg->sg_segs[0].ss_paddr = paddr;
367 sg->sg_segs[0].ss_len = len;
368 sg->sg_nseg = 1;
371 ss = &sg->sg_segs[sg->sg_nseg - 1];
372 SGLIST_SAVE(sg, save);
373 error = _sglist_append_range(sg, &ss, paddr, len);
375 SGLIST_RESTORE(sg, save);
384 sglist_append_mbuf_epg(struct sglist *sg, struct mbuf *m, size_t off,
403 error = sglist_append(sg,
421 error = sglist_append_phys(sg, paddr, seglen);
427 error = sglist_append(sg,
441 sglist_append_mbuf(struct sglist *sg, struct mbuf *m0)
447 if (sg->sg_maxseg == 0)
451 SGLIST_SAVE(sg, save);
455 error = sglist_append_mbuf_epg(sg, m,
458 error = sglist_append(sg, m->m_data,
461 SGLIST_RESTORE(sg, save);
475 sglist_append_vmpages(struct sglist *sg, vm_page_t *m, size_t pgoff,
484 if (sg->sg_maxseg == 0)
489 SGLIST_SAVE(sg, save);
491 if (sg->sg_nseg == 0) {
493 sg->sg_segs[0].ss_paddr = VM_PAGE_TO_PHYS(m[0]) + pgoff;
494 sg->sg_segs[0].ss_len = seglen;
495 sg->sg_nseg = 1;
500 ss = &sg->sg_segs[sg->sg_nseg - 1];
504 error = _sglist_append_range(sg, &ss, paddr, seglen);
506 SGLIST_RESTORE(sg, save);
520 sglist_append_user(struct sglist *sg, void *buf, size_t len, struct thread *td)
525 if (sg->sg_maxseg == 0)
527 SGLIST_SAVE(sg, save);
528 error = _sglist_append_buf(sg, buf, len,
531 SGLIST_RESTORE(sg, save);
537 * the scatter/gather list 'sg'. If there are insufficient segments,
541 sglist_append_sglist(struct sglist *sg, struct sglist *source, size_t offset,
549 if (sg->sg_maxseg == 0 || length == 0)
551 SGLIST_SAVE(sg, save);
553 ss = &sg->sg_segs[sg->sg_nseg - 1];
562 error = _sglist_append_range(sg, &ss,
574 SGLIST_RESTORE(sg, save);
584 sglist_append_uio(struct sglist *sg, struct uio *uio)
592 if (sg->sg_maxseg == 0)
606 SGLIST_SAVE(sg, save);
614 error = _sglist_append_buf(sg, iov[i].iov_base, minlen,
617 SGLIST_RESTORE(sg, save);
632 sglist_consume_uio(struct sglist *sg, struct uio *uio, size_t resid)
639 if (sg->sg_maxseg == 0)
665 error = _sglist_append_buf(sg, iov->iov_base, len, pmap, &done);
684 struct sglist *sg;
691 sg = sglist_alloc(nsegs, mflags);
692 if (sg == NULL)
694 if (sglist_append(sg, buf, len) != 0) {
695 sglist_free(sg);
698 return (sg);
705 sglist_clone(struct sglist *sg, int mflags)
709 if (sg == NULL)
711 new = sglist_alloc(sg->sg_maxseg, mflags);
714 new->sg_nseg = sg->sg_nseg;
715 bcopy(sg->sg_segs, new->sg_segs, sizeof(struct sglist_seg) *
716 sg->sg_nseg);
725 sglist_length(struct sglist *sg)
731 for (i = 0; i < sg->sg_nseg; i++)
732 space += sg->sg_segs[i].ss_len;
757 struct sglist *sg;
788 sg = sglist_alloc(count, mflags);
789 if (sg == NULL)
791 *head = sg;
793 sg = *head;
794 if (sg->sg_maxseg < count)
796 if (sg->sg_nseg != 0)
800 /* Copy 'count' entries to 'sg' from 'original'. */
801 bcopy(original->sg_segs, sg->sg_segs, count *
803 sg->sg_nseg = count;
807 * 'sg' and the new first entry in 'original'. We also
813 sg->sg_segs[count].ss_len -= split;
815 sg->sg_segs[count].ss_paddr + split;
888 struct sglist *sg;
938 sg = sglist_alloc(count, mflags);
939 if (sg == NULL)
941 *slice = sg;
943 sg = *slice;
944 if (sg->sg_maxseg < count)
946 if (sg->sg_nseg != 0)
952 * 'fseg' to 'sg'.
954 bcopy(original->sg_segs + fseg, sg->sg_segs,
956 sg->sg_nseg = count;
960 sg->sg_segs[0].ss_paddr += foffs;
961 sg->sg_segs[0].ss_len -= foffs;
963 (long)sg->sg_segs[0].ss_paddr, sg->sg_segs[0].ss_len);
966 sg->sg_segs[count - 1].ss_len -= loffs;
968 sg->sg_segs[count - 1].ss_len);