Deprecate MCLGET() in favor of m_getcl() or m_getl() in order to
authorJeffrey Hsu <hsu@dragonflybsd.org>
Sun, 29 May 2005 10:08:36 +0000 (10:08 +0000)
committerJeffrey Hsu <hsu@dragonflybsd.org>
Sun, 29 May 2005 10:08:36 +0000 (10:08 +0000)
take advantage of cluster caching.

14 files changed:
sys/dev/netif/de/if_de.c
sys/dev/netif/fxp/if_fxp.c
sys/kern/uipc_mbuf.c
sys/kern/uipc_mbuf2.c
sys/kern/uipc_socket.c
sys/kern/uipc_socket2.c
sys/net/rtsock.c
sys/netinet/tcp_output.c
sys/sys/mbuf.h
sys/vfs/nfs/krpc_subr.c
sys/vfs/nfs/nfs_serv.c
sys/vfs/nfs/nfs_socket.c
sys/vfs/nfs/nfs_subs.c
sys/vfs/nfs/nfsm_subs.h

index 0ec3529..609afd4 100644 (file)
@@ -1,7 +1,7 @@
 /*     $NetBSD: if_de.c,v 1.86 1999/06/01 19:17:59 thorpej Exp $       */
 
 /* $FreeBSD: src/sys/pci/if_de.c,v 1.123.2.4 2000/08/04 23:25:09 peter Exp $ */
-/* $DragonFly: src/sys/dev/netif/de/if_de.c,v 1.36 2005/05/24 20:59:01 dillon Exp $ */
+/* $DragonFly: src/sys/dev/netif/de/if_de.c,v 1.37 2005/05/29 10:08:35 hsu Exp $ */
 
 /*-
  * Copyright (c) 1994-1997 Matt Thomas (matt@3am-software.com)
@@ -3149,20 +3149,16 @@ tulip_rx_intr(tulip_softc_t *sc)
         */
        if (accept || ms == NULL) {
            struct mbuf *m0;
-           MGETHDR(m0, MB_DONTWAIT, MT_DATA);
-           if (m0 != NULL) {
-#if defined(TULIP_COPY_RXDATA)
-               if (!accept || total_len >= (MHLEN - 2)) {
-#endif
-                   MCLGET(m0, MB_DONTWAIT);
-                   if ((m0->m_flags & M_EXT) == 0) {
-                       m_freem(m0);
-                       m0 = NULL;
-                   }
+
 #if defined(TULIP_COPY_RXDATA)
-               }
+           if (!accept || total_len >= (MHLEN - 2))
+               m0 = m_getcl(MB_DONTWAIT, MT_DATA, M_PKTHDR);
+           else
+               m0 = m_gethdr(MB_DONTWAIT, MT_DATA);
+#else
+           m0 = m_getcl(MB_DONTWAIT, MT_DATA, M_PKTHDR);
 #endif
-           }
+
            if (accept
 #if defined(TULIP_COPY_RXDATA)
                && m0 != NULL
index 41af282..8439036 100644 (file)
@@ -26,7 +26,7 @@
  * SUCH DAMAGE.
  *
  * $FreeBSD: src/sys/dev/fxp/if_fxp.c,v 1.110.2.30 2003/06/12 16:47:05 mux Exp $
- * $DragonFly: src/sys/dev/netif/fxp/if_fxp.c,v 1.28 2005/05/27 15:03:12 joerg Exp $
+ * $DragonFly: src/sys/dev/netif/fxp/if_fxp.c,v 1.29 2005/05/29 10:08:36 hsu Exp $
  */
 
 /*
@@ -1052,7 +1052,7 @@ fxp_start(struct ifnet *ifp)
         */
        while (!ifq_is_empty(&ifp->if_snd) && sc->tx_queued < FXP_NTXCB - 1) {
                struct mbuf *m, *mb_head;
-               int segment;
+               int segment, ntries = 0;
 
                /*
                 * Grab a packet to transmit. The packet is dequeued,
@@ -1091,23 +1091,16 @@ tbdinit:
                         * mbuf chain first. Bail out if we can't get the
                         * new buffers.
                         */
-                       MGETHDR(mn, MB_DONTWAIT, MT_DATA);
+                       if (ntries > 0)
+                               break;
+                       mn = m_dup(mb_head, MB_DONTWAIT);
                        if (mn == NULL)
                                break;
-                       if (mb_head->m_pkthdr.len > MHLEN) {
-                               MCLGET(mn, MB_DONTWAIT);
-                               if ((mn->m_flags & M_EXT) == 0) {
-                                       m_freem(mn);
-                                       break;
-                               }
-                       }
-                       m_copydata(mb_head, 0, mb_head->m_pkthdr.len,
-                           mtod(mn, caddr_t));
-                       mn->m_pkthdr.len = mn->m_len = mb_head->m_pkthdr.len;
                         /* We can transmit the packet, dequeue it. */
                        mb_head = ifq_dequeue(&ifp->if_snd);
                        m_freem(mb_head);
                        mb_head = mn;
+                       ntries = 1;
                        goto tbdinit;
                } else {
                        /* Nothing to worry about, just dequeue. */
index f01cc34..4c994bb 100644 (file)
@@ -82,7 +82,7 @@
  *
  * @(#)uipc_mbuf.c     8.2 (Berkeley) 1/4/94
  * $FreeBSD: src/sys/kern/uipc_mbuf.c,v 1.51.2.24 2003/04/15 06:59:29 silby Exp $
- * $DragonFly: src/sys/kern/uipc_mbuf.c,v 1.36 2005/04/20 21:37:06 hsu Exp $
+ * $DragonFly: src/sys/kern/uipc_mbuf.c,v 1.37 2005/05/29 10:08:36 hsu Exp $
  */
 
 #include "opt_param.h"
@@ -830,70 +830,55 @@ m_getcl(int how, short type, int flags)
 }
 
 /*
- * struct mbuf *
- * m_getm(m, len, how, type)
- *
- * This will allocate len-worth of mbufs and/or mbuf clusters (whatever fits
- * best) and return a pointer to the top of the allocated chain. If m is
+ * Allocate chain of requested length.
+ */
+struct mbuf *
+m_getc(int len, int how, int type)
+{
+       struct mbuf *n, *nfirst = NULL, **ntail = &nfirst;
+       int nsize;
+
+       while (len > 0) {
+               n = m_getl(len, how, type, 0, &nsize);
+               if (n == NULL)
+                       goto failed;
+               n->m_len = 0;
+               *ntail = n;
+               ntail = &n->m_next;
+               len -= nsize;
+       }
+       return (nfirst);
+
+failed:
+       m_freem(nfirst);
+       return (NULL);
+}
+
+/*
+ * Allocate len-worth of mbufs and/or mbuf clusters (whatever fits best)
+ * and return a pointer to the head of the allocated chain. If m0 is
  * non-null, then we assume that it is a single mbuf or an mbuf chain to
  * which we want len bytes worth of mbufs and/or clusters attached, and so
- * if we succeed in allocating it, we will just return a pointer to m.
+ * if we succeed in allocating it, we will just return a pointer to m0.
  *
  * If we happen to fail at any point during the allocation, we will free
  * up everything we have already allocated and return NULL.
  *
+ * Deprecated.  Use m_getc() and m_cat() instead.
  */
 struct mbuf *
-m_getm(struct mbuf *m, int len, int how, int type)
+m_getm(struct mbuf *m0, int len, int how, int type)
 {
-       struct mbuf *top, *tail, *mp, *mtail = NULL;
-
-       KASSERT(len >= 0, ("len is < 0 in m_getm"));
-
-       mp = m_get(how, type);
-       if (mp == NULL) {
-               return (NULL);
-       } else if (len > MINCLSIZE) {
-               m_mclget(mp, how);
-               if ((mp->m_flags & M_EXT) == 0) {
-                       m_free(mp);
-                       return (NULL);
-               }
-       }
-       mp->m_len = 0;
-       len -= M_TRAILINGSPACE(mp);
-
-       if (m != NULL) {
-               for (mtail = m; mtail->m_next != NULL; mtail = mtail->m_next)
-                       ;
-       } else {
-               m = mp;
-       }
-
-       top = tail = mp;
-       while (len > 0) {
-               mp = m_get(how, type);
-               if (mp == NULL)
-                       goto failed;
+       struct mbuf *nfirst;
 
-               tail->m_next = mp;
-               tail = mp;
-               if (len > MINCLSIZE) {
-                       m_mclget(mp, how);
-                       if ((mp->m_flags & M_EXT) == 0)
-                               goto failed;
-               }
+       nfirst = m_getc(len, how, type);
 
-               mp->m_len = 0;
-               len -= M_TRAILINGSPACE(mp);
+       if (m0 != NULL) {
+               m_last(m0)->m_next = nfirst;
+               return (m0);
        }
 
-       if (mtail != NULL)
-               mtail->m_next = top;
-       return (m);
-failed:
-       m_freem(top);
-       return (NULL);
+       return (nfirst);
 }
 
 /*
@@ -1283,7 +1268,7 @@ m_dup(struct mbuf *m, int how)
 
        /* Sanity check */
        if (m == NULL)
-               return (0);
+               return (NULL);
        KASSERT((m->m_flags & M_PKTHDR) != 0, ("%s: !PKTHDR", __func__));
 
        /* While there's more data, get a new mbuf, tack it on, and fill it */
@@ -1294,30 +1279,20 @@ m_dup(struct mbuf *m, int how)
                struct mbuf *n;
 
                /* Get the next new mbuf */
-               MGET(n, how, m->m_type);
+               n = m_getl(remain, how, m->m_type, top == NULL ? M_PKTHDR : 0,
+                          &nsize);
                if (n == NULL)
                        goto nospace;
-               if (top == NULL) {              /* first one, must be PKTHDR */
+               if (top == NULL)
                        if (!m_dup_pkthdr(n, m, how))
-                               goto nospace;
-                       nsize = MHLEN;
-               } else                          /* not the first one */
-                       nsize = MLEN;
-               if (remain >= MINCLSIZE) {
-                       MCLGET(n, how);
-                       if ((n->m_flags & M_EXT) == 0) {
-                               (void)m_free(n);
-                               goto nospace;
-                       }
-                       nsize = MCLBYTES;
-               }
-               n->m_len = 0;
+                               goto nospace0;
 
                /* Link it into the new chain */
                *p = n;
                p = &n->m_next;
 
                /* Copy data from original mbuf(s) into new mbuf */
+               n->m_len = 0;
                while (n->m_len < nsize && m != NULL) {
                        int chunk = min(nsize - n->m_len, m->m_len - moff);
 
@@ -1333,14 +1308,15 @@ m_dup(struct mbuf *m, int how)
 
                /* Check correct total mbuf length */
                KASSERT((remain > 0 && m != NULL) || (remain == 0 && m == NULL),
-                       ("%s: bogus m_pkthdr.len", __func__));
+                       ("%s: bogus m_pkthdr.len", __func__));
        }
        return (top);
 
 nospace:
        m_freem(top);
-       MCFail++;
-       return (0);
+nospace0:
+       mbstat.m_mcfail++;
+       return (NULL);
 }
 
 /*
@@ -1351,8 +1327,7 @@ nospace:
 void
 m_cat(struct mbuf *m, struct mbuf *n)
 {
-       while (m->m_next)
-               m = m->m_next;
+       m = m_last(m);
        while (n) {
                if (m->m_flags & M_EXT ||
                    m->m_data + m->m_len + n->m_len >= &m->m_dat[MLEN]) {
@@ -1573,71 +1548,47 @@ extpacket:
        m->m_next = 0;
        return (n);
 }
+
 /*
  * Routine to copy from device local memory into mbufs.
+ * Note: "offset" is ill-defined and always called as 0, so ignore it.
  */
 struct mbuf *
-m_devget(char *buf, int totlen, int off0, struct ifnet *ifp, 
-       void (*copy) (char *from, caddr_t to, u_int len))
+m_devget(char *buf, int len, int offset, struct ifnet *ifp,
+    void (*copy)(volatile const void *from, volatile void *to, size_t length))
 {
-       struct mbuf *m;
-       struct mbuf *top = 0, **mp = &top;
-       int off = off0, len;
-       char *cp;
-       char *epkt;
-
-       cp = buf;
-       epkt = cp + totlen;
-       if (off) {
-               cp += off + 2 * sizeof(u_short);
-               totlen -= 2 * sizeof(u_short);
-       }
-       MGETHDR(m, MB_DONTWAIT, MT_DATA);
-       if (m == 0)
-               return (0);
-       m->m_pkthdr.rcvif = ifp;
-       m->m_pkthdr.len = totlen;
-       m->m_len = MHLEN;
-
-       while (totlen > 0) {
-               if (top) {
-                       MGET(m, MB_DONTWAIT, MT_DATA);
-                       if (m == 0) {
-                               m_freem(top);
-                               return (0);
-                       }
-                       m->m_len = MLEN;
+       struct mbuf *m, *mfirst = NULL, **mtail;
+       int nsize, flags;
+
+       if (copy == NULL)
+               copy = bcopy;
+       mtail = &mfirst;
+       flags = M_PKTHDR;
+
+       while (len > 0) {
+               m = m_getl(len, MB_DONTWAIT, MT_DATA, flags, &nsize);
+               if (m == NULL) {
+                       m_freem(mfirst);
+                       return (NULL);
                }
-               len = min(totlen, epkt - cp);
-               if (len >= MINCLSIZE) {
-                       MCLGET(m, MB_DONTWAIT);
-                       if (m->m_flags & M_EXT)
-                               m->m_len = len = min(len, MCLBYTES);
-                       else
-                               len = m->m_len;
-               } else {
-                       /*
-                        * Place initial small packet/header at end of mbuf.
-                        */
-                       if (len < m->m_len) {
-                               if (top == 0 && len + max_linkhdr <= m->m_len)
-                                       m->m_data += max_linkhdr;
-                               m->m_len = len;
-                       } else
-                               len = m->m_len;
+               m->m_len = min(len, nsize);
+
+               if (flags & M_PKTHDR) {
+                       if (len + max_linkhdr <= nsize)
+                               m->m_data += max_linkhdr;
+                       m->m_pkthdr.rcvif = ifp;
+                       m->m_pkthdr.len = len;
+                       flags = 0;
                }
-               if (copy)
-                       copy(cp, mtod(m, caddr_t), (unsigned)len);
-               else
-                       bcopy(cp, mtod(m, caddr_t), (unsigned)len);
-               cp += len;
-               *mp = m;
-               mp = &m->m_next;
-               totlen -= len;
-               if (cp == epkt)
-                       cp = buf;
+
+               copy(buf, m->m_data, (unsigned)m->m_len);
+               buf += m->m_len;
+               len -= m->m_len;
+               *mtail = m;
+               mtail = &m->m_next;
        }
-       return (top);
+
+       return (mfirst);
 }
 
 /*
@@ -1886,6 +1837,14 @@ failed:
        return (NULL);
 }
 
+struct mbuf *
+m_last(struct mbuf *m)
+{
+       while (m->m_next)
+               m = m->m_next;
+       return (m);
+}
+
 /*
  * Return the number of bytes in an mbuf chain.
  * If lastm is not NULL, also return the last mbuf.
index aa97019..9e260d8 100644 (file)
@@ -1,5 +1,5 @@
 /*     $FreeBSD: src/sys/kern/uipc_mbuf2.c,v 1.2.2.5 2003/01/23 21:06:44 sam Exp $     */
-/*     $DragonFly: src/sys/kern/uipc_mbuf2.c,v 1.8 2004/07/31 07:52:48 dillon Exp $    */
+/*     $DragonFly: src/sys/kern/uipc_mbuf2.c,v 1.9 2005/05/29 10:08:36 hsu Exp $       */
 /*     $KAME: uipc_mbuf2.c,v 1.31 2001/11/28 11:08:53 itojun Exp $     */
 /*     $NetBSD: uipc_mbuf.c,v 1.40 1999/04/01 00:23:25 thorpej Exp $   */
 
@@ -208,14 +208,7 @@ m_pulldown(m, off, len, offp)
         * now, we need to do the hard way.  don't m_copy as there's no room
         * on both end.
         */
-       MGET(o, MB_DONTWAIT, m->m_type);
-       if (o && len > MLEN) {
-               MCLGET(o, MB_DONTWAIT);
-               if ((o->m_flags & M_EXT) == 0) {
-                       m_free(o);
-                       o = NULL;
-               }
-       }
+       o = m_getl(len, MB_DONTWAIT, m->m_type, 0, NULL);
        if (!o) {
                m_freem(m);
                return NULL;    /* ENOBUFS */
@@ -256,31 +249,13 @@ m_dup1(m, off, len, wait)
        int wait;
 {
        struct mbuf *n;
-       int l;
-       int copyhdr;
 
        if (len > MCLBYTES)
                return NULL;
-       if (off == 0 && (m->m_flags & M_PKTHDR) != 0) {
-               copyhdr = 1;
-               MGETHDR(n, wait, m->m_type);
-               l = MHLEN;
-       } else {
-               copyhdr = 0;
-               MGET(n, wait, m->m_type);
-               l = MLEN;
-       }
-       if (n && len > l) {
-               MCLGET(n, wait);
-               if ((n->m_flags & M_EXT) == 0) {
-                       m_free(n);
-                       n = NULL;
-               }
-       }
+       n = m_getl(len, wait, m->m_type, m->m_flags, NULL);
        if (!n)
                return NULL;
-
-       if (copyhdr && !m_dup_pkthdr(n, m, wait)) {
+       if (off == 0 && (m->m_flags & M_PKTHDR) && !m_dup_pkthdr(n, m, wait)) {
                m_free(n);
                return NULL;
        }
index 66fcc1e..0f9ef54 100644 (file)
@@ -82,7 +82,7 @@
  *
  *     @(#)uipc_socket.c       8.3 (Berkeley) 4/15/94
  * $FreeBSD: src/sys/kern/uipc_socket.c,v 1.68.2.24 2003/11/11 17:18:18 silby Exp $
- * $DragonFly: src/sys/kern/uipc_socket.c,v 1.29 2005/03/31 19:28:54 dillon Exp $
+ * $DragonFly: src/sys/kern/uipc_socket.c,v 1.30 2005/05/29 10:08:36 hsu Exp $
  */
 
 #include "opt_inet.h"
@@ -585,32 +585,14 @@ restart:
                        if (flags & MSG_EOR)
                                top->m_flags |= M_EOR;
                    } else do {
-                       if (top == 0) {
-                               MGETHDR(m, MB_WAIT, MT_DATA);
-                               if (m == NULL) {
-                                       error = ENOBUFS;
-                                       goto release;
-                               }
-                               mlen = MHLEN;
+                       m = m_getl(resid, MB_WAIT, MT_DATA,
+                                  top == NULL ? M_PKTHDR : 0, &mlen);
+                       if (top == NULL) {
                                m->m_pkthdr.len = 0;
                                m->m_pkthdr.rcvif = (struct ifnet *)0;
-                       } else {
-                               MGET(m, MB_WAIT, MT_DATA);
-                               if (m == NULL) {
-                                       error = ENOBUFS;
-                                       goto release;
-                               }
-                               mlen = MLEN;
                        }
-                       if (resid >= MINCLSIZE) {
-                               MCLGET(m, MB_WAIT);
-                               if ((m->m_flags & M_EXT) == 0)
-                                       goto nopages;
-                               mlen = MCLBYTES;
-                               len = min(min(mlen, resid), space);
-                       } else {
-nopages:
-                               len = min(min(mlen, resid), space);
+                       len = min(min(mlen, resid), space);
+                       if (resid < MINCLSIZE) {
                                /*
                                 * For datagram protocols, leave room
                                 * for protocol headers in first mbuf.
index 2dd6b05..d8cf813 100644 (file)
@@ -33,7 +33,7 @@
  *
  *     @(#)uipc_socket2.c      8.1 (Berkeley) 6/10/93
  * $FreeBSD: src/sys/kern/uipc_socket2.c,v 1.55.2.17 2002/08/31 19:04:55 dwmalone Exp $
- * $DragonFly: src/sys/kern/uipc_socket2.c,v 1.18 2005/04/20 21:37:06 hsu Exp $
+ * $DragonFly: src/sys/kern/uipc_socket2.c,v 1.19 2005/05/29 10:08:36 hsu Exp $
  */
 
 #include "opt_param.h"
@@ -880,23 +880,14 @@ sbcreatecontrol(p, size, type, level)
        struct mbuf *m;
 
        if (CMSG_SPACE((u_int)size) > MCLBYTES)
-               return ((struct mbuf *) NULL);
-       if ((m = m_get(MB_DONTWAIT, MT_CONTROL)) == NULL)
-               return ((struct mbuf *) NULL);
-       if (CMSG_SPACE((u_int)size) > MLEN) {
-               MCLGET(m, MB_DONTWAIT);
-               if ((m->m_flags & M_EXT) == 0) {
-                       m_free(m);
-                       return ((struct mbuf *) NULL);
-               }
-       }
+               return (NULL);
+       m = m_getl(CMSG_SPACE((u_int)size), MB_DONTWAIT, MT_CONTROL, 0, NULL);
+       if (m == NULL)
+               return (NULL);
+       m->m_len = CMSG_SPACE(size);
        cp = mtod(m, struct cmsghdr *);
-       m->m_len = 0;
-       KASSERT(CMSG_SPACE((u_int)size) <= M_TRAILINGSPACE(m),
-           ("sbcreatecontrol: short mbuf"));
        if (p != NULL)
-               (void)memcpy(CMSG_DATA(cp), p, size);
-       m->m_len = CMSG_SPACE(size);
+               memcpy(CMSG_DATA(cp), p, size);
        cp->cmsg_len = CMSG_LEN(size);
        cp->cmsg_level = level;
        cp->cmsg_type = type;
index 254792e..a8f703a 100644 (file)
@@ -82,7 +82,7 @@
  *
  *     @(#)rtsock.c    8.7 (Berkeley) 10/12/95
  * $FreeBSD: src/sys/net/rtsock.c,v 1.44.2.11 2002/12/04 14:05:41 ru Exp $
- * $DragonFly: src/sys/net/rtsock.c,v 1.26 2005/05/25 01:44:16 dillon Exp $
+ * $DragonFly: src/sys/net/rtsock.c,v 1.27 2005/05/29 10:08:36 hsu Exp $
  */
 
 #include <sys/param.h>
@@ -765,16 +765,9 @@ rt_msg_mbuf(int type, struct rt_addrinfo *rtinfo)
        hlen = rt_msghdrsize(type);
        KASSERT(hlen <= MCLBYTES, ("rt_msg_mbuf: hlen %d doesn't fit", hlen));
 
-       m = m_gethdr(MB_DONTWAIT, MT_DATA);
+       m = m_getl(hlen, MB_DONTWAIT, MT_DATA, M_PKTHDR, NULL);
        if (m == NULL)
                return (NULL);
-       if (hlen > MHLEN) {
-               MCLGET(m, MB_DONTWAIT);
-               if (!(m->m_flags & M_EXT)) {
-                       m_free(m);
-                       return (NULL);
-               }
-       }
        m->m_pkthdr.len = m->m_len = hlen;
        m->m_pkthdr.rcvif = NULL;
        rtinfo->rti_addrs = 0;
index 9112212..c3586ef 100644 (file)
@@ -82,7 +82,7 @@
  *
  *     @(#)tcp_output.c        8.4 (Berkeley) 5/24/95
  * $FreeBSD: src/sys/netinet/tcp_output.c,v 1.39.2.20 2003/01/29 22:45:36 hsu Exp $
- * $DragonFly: src/sys/netinet/tcp_output.c,v 1.28 2005/05/10 15:48:10 hsu Exp $
+ * $DragonFly: src/sys/netinet/tcp_output.c,v 1.29 2005/05/29 10:08:36 hsu Exp $
  */
 
 #include "opt_inet6.h"
@@ -681,21 +681,16 @@ send:
                m->m_len += hdrlen;
                m->m_data -= hdrlen;
 #else
-               MGETHDR(m, MB_DONTWAIT, MT_HEADER);
+#ifndef INET6
+               m = m_gethdr(MB_DONTWAIT, MT_HEADER);
+#else
+               m = m_getl(hdrlen + max_linkhdr, MB_DONTWAIT, MT_HEADER,
+                          M_PKTHDR, NULL);
+#endif
                if (m == NULL) {
                        error = ENOBUFS;
                        goto out;
                }
-#ifdef INET6
-               if (MHLEN < hdrlen + max_linkhdr) {
-                       MCLGET(m, MB_DONTWAIT);
-                       if (!(m->m_flags & M_EXT)) {
-                               m_freem(m);
-                               error = ENOBUFS;
-                               goto out;
-                       }
-               }
-#endif
                m->m_data += max_linkhdr;
                m->m_len = hdrlen;
                if (len <= MHLEN - hdrlen - max_linkhdr) {
index fd6e2e8..76fd073 100644 (file)
@@ -34,7 +34,7 @@
  *
  *     @(#)mbuf.h      8.5 (Berkeley) 2/19/95
  * $FreeBSD: src/sys/sys/mbuf.h,v 1.44.2.17 2003/04/15 06:15:02 silby Exp $
- * $DragonFly: src/sys/sys/mbuf.h,v 1.24 2005/04/20 21:37:06 hsu Exp $
+ * $DragonFly: src/sys/sys/mbuf.h,v 1.25 2005/05/29 10:08:36 hsu Exp $
  */
 
 #ifndef _SYS_MBUF_H_
@@ -339,6 +339,7 @@ struct mbstat {
 /*
  * MCLGET adds such clusters to a normal mbuf.  The flag M_EXT is set upon
  * success.
+ * Deprecated.  Use m_getcl() or m_getl() instead.
  */
 #define        MCLGET(m, how) do {                                             \
        m_mclget((m), (how));                                           \
@@ -462,16 +463,18 @@ struct    mbuf    *m_copypacket(struct mbuf *, int);
 struct mbuf    *m_defrag(struct mbuf *, int);
 struct mbuf    *m_defrag_nofree(struct mbuf *, int);
 struct mbuf    *m_devget(char *, int, int, struct ifnet *,
-                   void (*copy)(char *, caddr_t, u_int));
+                 void (*copy)(volatile const void *, volatile void *, size_t));
 struct mbuf    *m_dup(struct mbuf *, int);
 int             m_dup_pkthdr(struct mbuf *, const struct mbuf *, int);
 struct mbuf    *m_free(struct mbuf *);
 void            m_freem(struct mbuf *);
 struct mbuf    *m_get(int, int);
+struct mbuf    *m_getc(int len, int how, int type);
 struct  mbuf   *m_getcl(int how, short type, int flags);
 struct mbuf    *m_getclr(int, int);
 struct mbuf    *m_gethdr(int, int);
 struct mbuf    *m_getm(struct mbuf *, int, int, int);
+struct mbuf    *m_last(struct mbuf *m);
 u_int           m_lengthm(struct mbuf *m, struct mbuf **lastm);
 void            m_move_pkthdr(struct mbuf *, struct mbuf *);
 struct mbuf    *m_prepend(struct mbuf *, int, int);
@@ -486,6 +489,29 @@ void               m_mclget(struct mbuf *m, int how);
 int            m_sharecount(struct mbuf *m);
 void           m_chtype(struct mbuf *m, int type);
 
+/*
+ * Allocate the right type of mbuf for the desired total length.
+ */
+static __inline struct mbuf *
+m_getl(int len, int how, int type, int flags, int *psize)
+{
+       struct mbuf *m;
+       int size;
+
+       if (len >= MINCLSIZE) {
+               m = m_getcl(how, type, flags);
+               size = MCLBYTES;
+       } else if (flags & M_PKTHDR) {
+               m = m_gethdr(how, type);
+               size = MHLEN;
+       } else {
+               m = m_get(how, type);
+               size = MLEN;
+       }
+       if (psize != NULL)
+               *psize = size;
+       return (m);
+}
 
 /*
  * Packets may have annotations attached by affixing a list
index 876adfa..30f08ab 100644 (file)
@@ -1,6 +1,6 @@
 /*     $NetBSD: krpc_subr.c,v 1.12.4.1 1996/06/07 00:52:26 cgd Exp $   */
 /* $FreeBSD: src/sys/nfs/krpc_subr.c,v 1.13.2.1 2000/11/20 21:17:14 tegge Exp $        */
-/* $DragonFly: src/sys/vfs/nfs/krpc_subr.c,v 1.6 2004/06/02 14:43:04 eirikn Exp $      */
+/* $DragonFly: src/sys/vfs/nfs/krpc_subr.c,v 1.7 2005/05/29 10:08:36 hsu Exp $ */
 
 /*
  * Copyright (c) 1995 Gordon Ross, Adam Glass
@@ -467,14 +467,7 @@ xdr_string_encode(char *str, int len)
        if (mlen > MCLBYTES)            /* If too big, we just can't do it. */
                return (NULL);
 
-       m = m_get(MB_WAIT, MT_DATA);
-       if (mlen > MLEN) {
-               MCLGET(m, MB_WAIT);
-               if ((m->m_flags & M_EXT) == 0) {
-                       (void) m_free(m);       /* There can be only one. */
-                       return (NULL);
-               }
-       }
+       m = m_getl(mlen, MB_WAIT, MT_DATA, 0, NULL);
        xs = mtod(m, struct xdr_string *);
        m->m_len = mlen;
        xs->len = txdr_unsigned(len);
index 14ac419..318f5cf 100644 (file)
@@ -35,7 +35,7 @@
  *
  *     @(#)nfs_serv.c  8.8 (Berkeley) 7/31/95
  * $FreeBSD: src/sys/nfs/nfs_serv.c,v 1.93.2.6 2002/12/29 18:19:53 dillon Exp $
- * $DragonFly: src/sys/vfs/nfs/nfs_serv.c,v 1.22 2004/12/29 02:41:26 dillon Exp $
+ * $DragonFly: src/sys/vfs/nfs/nfs_serv.c,v 1.23 2005/05/29 10:08:36 hsu Exp $
  */
 
 /*
@@ -646,9 +646,8 @@ nfsrv_readlink(struct nfsrv_descript *nfsd, struct nfssvc_sock *slp,
        len = 0;
        i = 0;
        while (len < NFS_MAXPATHLEN) {
-               MGET(mp, MB_WAIT, MT_DATA);
-               MCLGET(mp, MB_WAIT);
-               mp->m_len = NFSMSIZ(mp);
+               mp = m_getcl(MB_WAIT, MT_DATA, 0);
+               mp->m_len = MCLBYTES;
                if (len == 0)
                        mp3 = mp2 = mp;
                else {
@@ -894,8 +893,7 @@ nfsrv_read(struct nfsrv_descript *nfsd, struct nfssvc_sock *slp,
                                i++;
                        }
                        if (left > 0) {
-                               MGET(m, MB_WAIT, MT_DATA);
-                               MCLGET(m, MB_WAIT);
+                               m = m_getcl(MB_WAIT, MT_DATA, 0);
                                m->m_len = 0;
                                m2->m_next = m;
                                m2 = m;
index bb8ab45..c0cb85f 100644 (file)
@@ -35,7 +35,7 @@
  *
  *     @(#)nfs_socket.c        8.5 (Berkeley) 3/30/95
  * $FreeBSD: src/sys/nfs/nfs_socket.c,v 1.60.2.6 2003/03/26 01:44:46 alfred Exp $
- * $DragonFly: src/sys/vfs/nfs/nfs_socket.c,v 1.26 2005/03/31 19:28:57 dillon Exp $
+ * $DragonFly: src/sys/vfs/nfs/nfs_socket.c,v 1.27 2005/05/29 10:08:36 hsu Exp $
  */
 
 /*
@@ -1747,10 +1747,7 @@ nfs_realign(struct mbuf **pm, int hsiz)
 
        while ((m = *pm) != NULL) {
                if ((m->m_len & 0x3) || (mtod(m, intptr_t) & 0x3)) {
-                       MGET(n, MB_WAIT, MT_DATA);
-                       if (m->m_len >= MINCLSIZE) {
-                               MCLGET(n, MB_WAIT);
-                       }
+                       n = m_getl(m->m_len, MB_WAIT, MT_DATA, 0, NULL);
                        n->m_len = 0;
                        break;
                }
index 1fe3903..758c2bf 100644 (file)
@@ -35,7 +35,7 @@
  *
  *     @(#)nfs_subs.c  8.8 (Berkeley) 5/22/95
  * $FreeBSD: /repoman/r/ncvs/src/sys/nfsclient/nfs_subs.c,v 1.128 2004/04/14 23:23:55 peadar Exp $
- * $DragonFly: src/sys/vfs/nfs/nfs_subs.c,v 1.29 2005/04/20 17:01:54 dillon Exp $
+ * $DragonFly: src/sys/vfs/nfs/nfs_subs.c,v 1.30 2005/05/29 10:08:36 hsu Exp $
  */
 
 /*
@@ -586,9 +586,7 @@ nfsm_reqh(struct vnode *vp, u_long procid, int hsiz, caddr_t *bposp)
        struct nfsmount *nmp;
        int nqflag;
 
-       MGET(mb, MB_WAIT, MT_DATA);
-       if (hsiz >= MINCLSIZE)
-               MCLGET(mb, MB_WAIT);
+       mb = m_getl(hsiz, MB_WAIT, MT_DATA, 0, NULL);
        mb->m_len = 0;
        bpos = mtod(mb, caddr_t);
 
@@ -699,12 +697,10 @@ nfsm_rpchead(struct ucred *cr, int nmflag, int procid, int auth_type,
                siz = auth_len;
                while (siz > 0) {
                        if (M_TRAILINGSPACE(mb) == 0) {
-                               MGET(mb2, MB_WAIT, MT_DATA);
-                               if (siz >= MINCLSIZE)
-                                       MCLGET(mb2, MB_WAIT);
+                               mb2 = m_getl(siz, MB_WAIT, MT_DATA, 0, NULL);
+                               mb2->m_len = 0;
                                mb->m_next = mb2;
                                mb = mb2;
-                               mb->m_len = 0;
                                bpos = mtod(mb, caddr_t);
                        }
                        i = min(siz, M_TRAILINGSPACE(mb));
@@ -732,12 +728,10 @@ nfsm_rpchead(struct ucred *cr, int nmflag, int procid, int auth_type,
                siz = verf_len;
                while (siz > 0) {
                        if (M_TRAILINGSPACE(mb) == 0) {
-                               MGET(mb2, MB_WAIT, MT_DATA);
-                               if (siz >= MINCLSIZE)
-                                       MCLGET(mb2, MB_WAIT);
+                               mb2 = m_getl(siz, MB_WAIT, MT_DATA, 0, NULL);
+                               mb2->m_len = 0;
                                mb->m_next = mb2;
                                mb = mb2;
-                               mb->m_len = 0;
                                bpos = mtod(mb, caddr_t);
                        }
                        i = min(siz, M_TRAILINGSPACE(mb));
@@ -844,7 +838,8 @@ nfsm_uiotombuf(struct uio *uiop, struct mbuf **mq, int siz, caddr_t *bpos)
        char *uiocp;
        struct mbuf *mp, *mp2;
        int xfer, left, mlen;
-       int uiosiz, clflg, rem;
+       int uiosiz, rem;
+       boolean_t getcluster;
        char *cp;
 
 #ifdef DIAGNOSTIC
@@ -852,11 +847,11 @@ nfsm_uiotombuf(struct uio *uiop, struct mbuf **mq, int siz, caddr_t *bpos)
                panic("nfsm_uiotombuf: iovcnt != 1");
 #endif
 
-       if (siz > MLEN)         /* or should it >= MCLBYTES ?? */
-               clflg = 1;
+       if (siz >= MINCLSIZE)
+               getcluster = TRUE;
        else
-               clflg = 0;
-       rem = nfsm_rndup(siz)-siz;
+               getcluster = FALSE;
+       rem = nfsm_rndup(siz) - siz;
        mp = mp2 = *mq;
        while (siz > 0) {
                left = uiop->uio_iov->iov_len;
@@ -867,9 +862,10 @@ nfsm_uiotombuf(struct uio *uiop, struct mbuf **mq, int siz, caddr_t *bpos)
                while (left > 0) {
                        mlen = M_TRAILINGSPACE(mp);
                        if (mlen == 0) {
-                               MGET(mp, MB_WAIT, MT_DATA);
-                               if (clflg)
-                                       MCLGET(mp, MB_WAIT);
+                               if (getcluster)
+                                       mp = m_getcl(MB_WAIT, MT_DATA, 0);
+                               else
+                                       mp = m_get(MB_WAIT, MT_DATA);
                                mp->m_len = 0;
                                mp2->m_next = mp;
                                mp2 = mp;
@@ -1028,10 +1024,10 @@ nfsm_strtmbuf(struct mbuf **mb, char **bpos, const char *cp, long siz)
        }
        /* Loop around adding mbufs */
        while (siz > 0) {
-               MGET(m1, MB_WAIT, MT_DATA);
-               if (siz > MLEN)
-                       MCLGET(m1, MB_WAIT);
-               m1->m_len = NFSMSIZ(m1);
+               int msize;
+
+               m1 = m_getl(siz, MB_WAIT, MT_DATA, 0, &msize);
+               m1->m_len = msize;
                m2->m_next = m1;
                m2 = m1;
                tl = mtod(m1, u_int32_t *);
index be394eb..592208e 100644 (file)
@@ -35,7 +35,7 @@
  *
  *     @(#)nfsm_subs.h 8.2 (Berkeley) 3/30/95
  * $FreeBSD: src/sys/nfs/nfsm_subs.h,v 1.27.2.1 2000/10/28 16:27:27 dwmalone Exp $
- * $DragonFly: src/sys/vfs/nfs/nfsm_subs.h,v 1.7 2005/03/17 17:28:46 dillon Exp $
+ * $DragonFly: src/sys/vfs/nfs/nfsm_subs.h,v 1.8 2005/05/29 10:08:36 hsu Exp $
  */
 
 
@@ -503,9 +503,8 @@ struct mbuf *nfsm_rpchead (struct ucred *cr, int nmflag, int procid,
                if (bp >= be) { \
                        if (mp == mb) \
                                mp->m_len += bp-bpos; \
-                       MGET(mp, MB_WAIT, MT_DATA); \
-                       MCLGET(mp, MB_WAIT); \
-                       mp->m_len = NFSMSIZ(mp); \
+                       mp = m_getcl(MB_WAIT, MT_DATA, 0); \
+                       mp->m_len = MCLBYTES; \
                        mp2->m_next = mp; \
                        mp2 = mp; \
                        bp = mtod(mp, caddr_t); \