PERFORCE change 126761 for review
Kip Macy
kmacy at FreeBSD.org
Sun Sep 23 21:55:11 PDT 2007
http://perforce.freebsd.org/chv.cgi?CH=126761
Change 126761 by kmacy at kmacy_home:ethng on 2007/09/24 04:55:03
remove old mbuf iovec code
Affected files ...
.. //depot/projects/ethng/src/sys/dev/cxgb/sys/uipc_mvec.c#4 edit
Differences ...
==== //depot/projects/ethng/src/sys/dev/cxgb/sys/uipc_mvec.c#4 (text+ko) ====
@@ -326,552 +326,3 @@
}
-#ifdef notyet
-int
-_m_explode(struct mbuf *m)
-{
- int i, offset, type, first, len;
- uint8_t *cl;
- volatile uint32_t *ref;
- struct mbuf *m0, *head = NULL;
- struct mbuf_vec *mv;
-
-#ifdef INVARIANTS
- len = m->m_len;
- m0 = m->m_next;
- while (m0) {
- KASSERT((m0->m_flags & M_PKTHDR) == 0,
- ("pkthdr set on intermediate mbuf - pre"));
- len += m0->m_len;
- m0 = m0->m_next;
-
- }
- if (len != m->m_pkthdr.len)
- panic("at start len=%d pktlen=%d", len, m->m_pkthdr.len);
-#endif
- mv = mtomv(m);
- first = mv->mv_first;
- for (i = mv->mv_count + first - 1; i > first; i--) {
- type = mbuf_vec_get_type(mv, i);
- cl = mv->mv_vec[i].mi_base;
- offset = mv->mv_vec[i].mi_offset;
- ref = mv->mv_vec[i].mi_refcnt;
- len = mv->mv_vec[i].mi_len;
- if (__predict_false(type == EXT_MBUF)) {
- m0 = (struct mbuf *)cl;
- KASSERT((m0->m_flags & M_EXT) == 0, ("M_EXT set on mbuf"));
- m0->m_len = len;
- m0->m_data = cl + offset;
- goto skip_cluster;
-
- } else if ((m0 = m_get(M_DONTWAIT, MT_DATA)) == NULL) {
- /*
- * Check for extra memory leaks
- */
- m_freem(head);
- return (ENOMEM);
- }
- m0->m_flags = 0;
-
- m_cljset(m0, (uint8_t *)cl, type, ref);
- m0->m_len = mv->mv_vec[i].mi_len;
- if (offset)
- m->m_data += offset;
- skip_cluster:
- m0->m_next = head;
- m->m_len -= m0->m_len;
- head = m0;
- }
- offset = mv->mv_vec[first].mi_offset;
- cl = mv->mv_vec[first].mi_base;
- ref = mv->mv_vec[first].mi_refcnt;
- type = mbuf_vec_get_type(mv, first);
- m->m_flags &= ~(M_IOVEC);
- m_cljset(m, cl, type, ref);
- if (offset)
- m->m_data += offset;
- m->m_next = head;
- head = m;
- M_SANITY(m, 0);
-
- return (0);
-}
-
-static __inline int
-m_vectorize(struct mbuf *m, int max, struct mbuf **vec, int *count)
-{
- int i, error = 0;
-
- for (i = 0; i < max; i++) {
- if (m == NULL)
- break;
-#ifndef MBUF_PACKET_ZONE_DISABLE
- if ((m->m_flags & M_EXT) && (m->m_ext.ext_type == EXT_PACKET))
- return (EINVAL);
-#endif
-#ifdef ZERO_COPY_SOCKETS
- if ((m->m_flags & M_EXT) && (m->m_ext.ext_type == EXT_SFBUF))
- return (EINVAL);
-#endif
- M_SANITY(m, 0);
- vec[i] = m;
- m = m->m_next;
- }
- if (m)
- error = EFBIG;
-
- *count = i;
-
- return (error);
-}
-
-static __inline int
-m_findmbufs(struct mbuf **ivec, int maxbufs, struct mbuf_ext *ovec, int osize, int *ocount)
-{
- int i, j, nhbufsneed, nhbufs;
- struct mbuf *m;
-
- nhbufsneed = min(((maxbufs - 1)/MAX_MBUF_IOV) + 1, osize);
- ovec[0].me_m = NULL;
-
- for (nhbufs = j = i = 0; i < maxbufs && nhbufs < nhbufsneed; i++) {
- if ((ivec[i]->m_flags & M_EXT) == 0)
- continue;
- m = ivec[i];
- ovec[nhbufs].me_m = m;
- ovec[nhbufs].me_base = m->m_ext.ext_buf;
- ovec[nhbufs].me_refcnt = m->m_ext.ref_cnt;
- ovec[nhbufs].me_offset = (m->m_data - m->m_ext.ext_buf);
- ovec[nhbufs].me_flags = m->m_ext.ext_type;
- nhbufs++;
- }
- if (nhbufs == 0) {
- if ((m = m_gethdr(M_DONTWAIT, MT_DATA)) == NULL)
- goto m_getfail;
- ovec[nhbufs].me_m = m;
- nhbufs = 1;
- }
- while (nhbufs < nhbufsneed) {
- if ((m = m_get(M_DONTWAIT, MT_DATA)) == NULL)
- goto m_getfail;
- ovec[nhbufs].me_m = m;
- nhbufs++;
- }
- /*
- * Copy over packet header to new head of chain
- */
- if (ovec[0].me_m != ivec[0]) {
- ovec[0].me_m->m_flags |= M_PKTHDR;
- memcpy(&ovec[0].me_m->m_pkthdr, &ivec[0]->m_pkthdr, sizeof(struct pkthdr));
- SLIST_INIT(&ivec[0]->m_pkthdr.tags);
- }
- *ocount = nhbufs;
- return (0);
-m_getfail:
- for (i = 0; i < nhbufs; i++)
- if ((ovec[i].me_m->m_flags & M_EXT) == 0)
- uma_zfree(zone_mbuf, ovec[i].me_m);
- return (ENOMEM);
-
-}
-
-static __inline void
-m_setiovec(struct mbuf_iovec *mi, struct mbuf *m, struct mbuf_ext *extvec, int *me_index,
- int max_me_index)
-{
- int idx = *me_index;
-
- mi->mi_len = m->m_len;
- if (idx < max_me_index && extvec[idx].me_m == m) {
- struct mbuf_ext *me = &extvec[idx];
- (*me_index)++;
- mi->mi_base = me->me_base;
- mi->mi_refcnt = me->me_refcnt;
- mi->mi_offset = me->me_offset;
- mi->mi_flags = me->me_flags;
- } else if (m->m_flags & M_EXT) {
- mi->mi_base = m->m_ext.ext_buf;
- mi->mi_refcnt = m->m_ext.ref_cnt;
- mi->mi_offset =
- (m->m_data - m->m_ext.ext_buf);
- mi->mi_flags = m->m_ext.ext_type;
- } else {
- KASSERT(m->m_len < 256, ("mbuf too large len=%d",
- m->m_len));
- mi->mi_base = (uint8_t *)m;
- mi->mi_refcnt = NULL;
- mi->mi_offset =
- (m->m_data - (caddr_t)m);
- mi->mi_flags = EXT_MBUF;
- }
- DPRINTF("type=%d len=%d refcnt=%p cl=%p offset=0x%x\n",
- mi->mi_flags, mi->mi_len, mi->mi_refcnt, mi->mi_base,
- mi->mi_offset);
-}
-
-int
-_m_collapse(struct mbuf *m, int maxbufs, struct mbuf **mnew)
-{
- struct mbuf *m0, *lmvec[MAX_BUFS];
- struct mbuf **mnext;
- struct mbuf **vec = lmvec;
- struct mbuf *mhead = NULL;
- struct mbuf_vec *mv;
- int err, i, j, max, len, nhbufs;
- struct mbuf_ext dvec[MAX_HVEC];
- int hidx = 0, dvecidx;
-
- M_SANITY(m, 0);
- if (maxbufs > MAX_BUFS) {
- if ((vec = malloc(maxbufs * sizeof(struct mbuf *),
- M_DEVBUF, M_NOWAIT)) == NULL)
- return (ENOMEM);
- }
-
- if ((err = m_vectorize(m, maxbufs, vec, &max)) != 0)
- goto out;
- if ((err = m_findmbufs(vec, max, dvec, MAX_HVEC, &nhbufs)) != 0)
- goto out;
-
- KASSERT(max > 0, ("invalid mbuf count"));
- KASSERT(nhbufs > 0, ("invalid header mbuf count"));
-
- mhead = m0 = dvec[0].me_m;
-
- DPRINTF("nbufs=%d nhbufs=%d\n", max, nhbufs);
- for (hidx = dvecidx = i = 0, mnext = NULL; i < max; hidx++) {
- m0 = dvec[hidx].me_m;
- m0->m_flags &= ~M_EXT;
- m0->m_flags |= M_IOVEC;
-
- if (mnext)
- *mnext = m0;
-
- mv = mtomv(m0);
- len = mv->mv_first = 0;
- for (j = 0; j < MAX_MBUF_IOV && i < max; j++, i++) {
- struct mbuf_iovec *mi = &mv->mv_vec[j];
-
- m_setiovec(mi, vec[i], dvec, &dvecidx, nhbufs);
- len += mi->mi_len;
- }
- m0->m_data = mv->mv_vec[0].mi_base + mv->mv_vec[0].mi_offset;
- mv->mv_count = j;
- m0->m_len = len;
- mnext = &m0->m_next;
- DPRINTF("count=%d len=%d\n", j, len);
- }
-
- /*
- * Terminate chain
- */
- m0->m_next = NULL;
-
- /*
- * Free all mbufs not used by the mbuf iovec chain
- */
- for (i = 0; i < max; i++)
- if (vec[i]->m_flags & M_EXT) {
- vec[i]->m_flags &= ~M_EXT;
- collapse_free++;
- uma_zfree(zone_mbuf, vec[i]);
- }
-
- *mnew = mhead;
-out:
- if (vec != lmvec)
- free(vec, M_DEVBUF);
- return (err);
-}
-
-
-void
-mb_free_vec(struct mbuf *m)
-{
- struct mbuf_vec *mv;
- int i;
-
- KASSERT((m->m_flags & (M_EXT|M_IOVEC)) == M_IOVEC,
- ("%s: M_EXT set", __func__));
-
- mv = mtomv(m);
- KASSERT(mv->mv_count <= MAX_MBUF_IOV,
- ("%s: mi_count too large %d", __func__, mv->mv_count));
-
- DPRINTF("count=%d len=%d\n", mv->mv_count, m->m_len);
- for (i = mv->mv_first; i < mv->mv_count; i++) {
- uma_zone_t zone = NULL;
- volatile int *refcnt = mv->mv_vec[i].mi_refcnt;
- int type = mbuf_vec_get_type(mv, i);
- void *cl = mv->mv_vec[i].mi_base;
-
- if ((type != EXT_MBUF) && *refcnt != 1 &&
- atomic_fetchadd_int(refcnt, -1) != 1)
- continue;
-
- DPRINTF("freeing idx=%d refcnt=%p type=%d cl=%p\n", i, refcnt, type, cl);
- switch (type) {
- case EXT_MBUF:
- mb_free_vec_free++;
- case EXT_CLUSTER:
- case EXT_JUMBOP:
- case EXT_JUMBO9:
- case EXT_JUMBO16:
- zone = m_getzonefromtype(type);
- uma_zfree(zone, cl);
- continue;
- case EXT_SFBUF:
- *refcnt = 0;
- uma_zfree(zone_ext_refcnt, __DEVOLATILE(u_int *,
- refcnt));
-#ifdef __i386__
- sf_buf_mext(cl, mv->mv_vec[i].mi_args);
-#else
- /*
- * Every architecture other than i386 uses a vm_page
- * for an sf_buf (well ... sparc64 does but shouldn't)
- */
- sf_buf_mext(cl, PHYS_TO_VM_PAGE(vtophys(cl)));
-#endif
- continue;
- default:
- KASSERT(m->m_ext.ext_type == 0,
- ("%s: unknown ext_type", __func__));
- break;
- }
- }
- /*
- * Free this mbuf back to the mbuf zone with all iovec
- * information purged.
- */
- mb_free_vec_free++;
- uma_zfree(zone_mbuf, m);
-}
-#endif
-
-#if (!defined(__sparc64__) && !defined(__sun4v__))
-#include <sys/types.h>
-#include <sys/sysctl.h>
-#include <sys/bus_dma.h>
-
-#define BUS_DMA_COULD_BOUNCE BUS_DMA_BUS3
-#define BUS_DMA_MIN_ALLOC_COMP BUS_DMA_BUS4
-
-struct bounce_zone {
- STAILQ_ENTRY(bounce_zone) links;
- STAILQ_HEAD(bp_list, bounce_page) bounce_page_list;
- int total_bpages;
- int free_bpages;
- int reserved_bpages;
- int active_bpages;
- int total_bounced;
- int total_deferred;
- bus_size_t alignment;
- bus_size_t boundary;
- bus_addr_t lowaddr;
- char zoneid[8];
- char lowaddrid[20];
- struct sysctl_ctx_list sysctl_tree;
- struct sysctl_oid *sysctl_tree_top;
-};
-struct bus_dma_tag {
- bus_dma_tag_t parent;
- bus_size_t alignment;
- bus_size_t boundary;
- bus_addr_t lowaddr;
- bus_addr_t highaddr;
- bus_dma_filter_t *filter;
- void *filterarg;
- bus_size_t maxsize;
- u_int nsegments;
- bus_size_t maxsegsz;
- int flags;
- int ref_count;
- int map_count;
- bus_dma_lock_t *lockfunc;
- void *lockfuncarg;
- bus_dma_segment_t *segments;
- struct bounce_zone *bounce_zone;
-};
-
-struct bus_dmamap {
- struct bp_list bpages;
- int pagesneeded;
- int pagesreserved;
- bus_dma_tag_t dmat;
- void *buf; /* unmapped buffer pointer */
- bus_size_t buflen; /* unmapped buffer length */
- bus_dmamap_callback_t *callback;
- void *callback_arg;
- STAILQ_ENTRY(bus_dmamap) links;
-};
-
-static struct bus_dmamap nobounce_dmamap;
-
-static __inline int
-run_filter(bus_dma_tag_t dmat, bus_addr_t paddr)
-{
- int retval;
-
- retval = 0;
-
- do {
- if (((paddr > dmat->lowaddr && paddr <= dmat->highaddr)
- || ((paddr & (dmat->alignment - 1)) != 0))
- && (dmat->filter == NULL
- || (*dmat->filter)(dmat->filterarg, paddr) != 0))
- retval = 1;
-
- dmat = dmat->parent;
- } while (retval == 0 && dmat != NULL);
- return (retval);
-}
-
-static __inline int
-_bus_dmamap_load_buffer(bus_dma_tag_t dmat,
- bus_dmamap_t map,
- void *buf, bus_size_t buflen,
- pmap_t pmap,
- int flags,
- bus_addr_t *lastaddrp,
- bus_dma_segment_t *segs,
- int *segp,
- int first)
-{
- bus_size_t sgsize;
- bus_addr_t curaddr, lastaddr, baddr, bmask;
- vm_offset_t vaddr;
- int needbounce = 0;
- int seg;
-
- if (map == NULL)
- map = &nobounce_dmamap;
-
- /* Reserve Necessary Bounce Pages */
- if (map->pagesneeded != 0)
- panic("don't support bounce pages");
-
- vaddr = (vm_offset_t)buf;
- lastaddr = *lastaddrp;
- bmask = ~(dmat->boundary - 1);
-
- for (seg = *segp; buflen > 0 ; ) {
- /*
- * Get the physical address for this segment.
- */
- if (pmap)
- curaddr = pmap_extract(pmap, vaddr);
- else
- curaddr = pmap_kextract(vaddr);
-
-
- /*
- * Compute the segment size, and adjust counts.
- */
- sgsize = PAGE_SIZE - ((u_long)curaddr & PAGE_MASK);
- if (buflen < sgsize)
- sgsize = buflen;
-
- /*
- * Make sure we don't cross any boundaries.
- */
- if (dmat->boundary > 0) {
- baddr = (curaddr + dmat->boundary) & bmask;
- if (sgsize > (baddr - curaddr))
- sgsize = (baddr - curaddr);
- }
-
- if (map->pagesneeded != 0 && run_filter(dmat, curaddr))
- panic("no bounce page support");
-
- /*
- * Insert chunk into a segment, coalescing with
- * previous segment if possible.
- */
- if (first) {
- segs[seg].ds_addr = curaddr;
- segs[seg].ds_len = sgsize;
- first = 0;
- } else {
- if (needbounce == 0 && curaddr == lastaddr &&
- (segs[seg].ds_len + sgsize) <= dmat->maxsegsz &&
- (dmat->boundary == 0 ||
- (segs[seg].ds_addr & bmask) == (curaddr & bmask)))
- segs[seg].ds_len += sgsize;
- else {
- if (++seg >= dmat->nsegments)
- break;
- segs[seg].ds_addr = curaddr;
- segs[seg].ds_len = sgsize;
- }
- }
-
- lastaddr = curaddr + sgsize;
- vaddr += sgsize;
- buflen -= sgsize;
- }
-
- *segp = seg;
- *lastaddrp = lastaddr;
-
- /*
- * Did we fit?
- */
- return (buflen != 0 ? EFBIG : 0); /* XXX better return value here? */
-}
-
-int
-bus_dmamap_load_mvec_sg(bus_dma_tag_t dmat, bus_dmamap_t map, struct mbuf *m0,
- bus_dma_segment_t *segs, int *nsegs, int flags)
-{
- int error, i;
-
- M_ASSERTPKTHDR(m0);
-
- if ((m0->m_flags & M_IOVEC) == 0)
- return (bus_dmamap_load_mbuf_sg(dmat, map, m0, segs, nsegs, flags));
-
- flags |= BUS_DMA_NOWAIT;
- *nsegs = 0;
- error = 0;
- if (m0->m_pkthdr.len <= dmat->maxsize) {
- int first = 1;
- bus_addr_t lastaddr = 0;
- struct mbuf *m;
-
- for (m = m0; m != NULL && error == 0; m = m->m_next) {
- struct mbuf_vec *mv;
- int count, firstcl;
- if (!(m->m_len > 0))
- continue;
-
- mv = mtomv(m);
- count = mv->mv_count;
- firstcl = mv->mv_first;
- KASSERT(count <= MAX_MBUF_IOV, ("count=%d too large", count));
- for (i = firstcl; i < count && error == 0; i++) {
- void *data = mv->mv_vec[i].mi_base + mv->mv_vec[i].mi_offset;
- int len = mv->mv_vec[i].mi_len;
-
- if (len == 0)
- continue;
- DPRINTF("mapping data=%p len=%d\n", data, len);
- error = _bus_dmamap_load_buffer(dmat, NULL,
- data, len, NULL, flags, &lastaddr,
- segs, nsegs, first);
- DPRINTF("%d: addr=0x%jx len=%ju\n", i,
- (uintmax_t)segs[i].ds_addr, (uintmax_t)segs[i].ds_len);
- first = 0;
- }
- }
- } else {
- error = EINVAL;
- }
-
- (*nsegs)++;
-
- CTR5(KTR_BUSDMA, "%s: tag %p tag flags 0x%x error %d nsegs %d",
- __func__, dmat, dmat->flags, error, *nsegs);
- return (error);
-}
-#endif /* !__sparc64__ && !__sun4v__ */
More information about the p4-projects
mailing list