From: Jeffrey Hsu Date: Sun, 29 May 2005 10:08:36 +0000 (+0000) Subject: Deprecate MCLGET() in favor of m_getcl() or m_getl() in order to X-Git-Tag: v2.0.1~7249 X-Git-Url: https://gitweb.dragonflybsd.org/dragonfly.git/commitdiff_plain/50503f0f827304d16faaebc14b00a77222dd7271 Deprecate MCLGET() in favor of m_getcl() or m_getl() in order to take advantage of cluster caching. --- diff --git a/sys/dev/netif/de/if_de.c b/sys/dev/netif/de/if_de.c index 0ec3529ff5..609afd4125 100644 --- a/sys/dev/netif/de/if_de.c +++ b/sys/dev/netif/de/if_de.c @@ -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 diff --git a/sys/dev/netif/fxp/if_fxp.c b/sys/dev/netif/fxp/if_fxp.c index 41af282b06..8439036eb6 100644 --- a/sys/dev/netif/fxp/if_fxp.c +++ b/sys/dev/netif/fxp/if_fxp.c @@ -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. */ diff --git a/sys/kern/uipc_mbuf.c b/sys/kern/uipc_mbuf.c index f01cc34f22..4c994bb378 100644 --- a/sys/kern/uipc_mbuf.c +++ b/sys/kern/uipc_mbuf.c @@ -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 = ⊤ - 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. diff --git a/sys/kern/uipc_mbuf2.c b/sys/kern/uipc_mbuf2.c index aa9701987b..9e260d8a8c 100644 --- a/sys/kern/uipc_mbuf2.c +++ b/sys/kern/uipc_mbuf2.c @@ -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; } diff --git a/sys/kern/uipc_socket.c b/sys/kern/uipc_socket.c index 66fcc1e25c..0f9ef54c0e 100644 --- a/sys/kern/uipc_socket.c +++ b/sys/kern/uipc_socket.c @@ -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. diff --git a/sys/kern/uipc_socket2.c b/sys/kern/uipc_socket2.c index 2dd6b0517c..d8cf8130f2 100644 --- a/sys/kern/uipc_socket2.c +++ b/sys/kern/uipc_socket2.c @@ -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; diff --git a/sys/net/rtsock.c b/sys/net/rtsock.c index 254792e720..a8f703a469 100644 --- a/sys/net/rtsock.c +++ b/sys/net/rtsock.c @@ -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 @@ -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; diff --git a/sys/netinet/tcp_output.c b/sys/netinet/tcp_output.c index 9112212938..c3586ef683 100644 --- a/sys/netinet/tcp_output.c +++ b/sys/netinet/tcp_output.c @@ -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) { diff --git a/sys/sys/mbuf.h b/sys/sys/mbuf.h index fd6e2e88b9..76fd073fc3 100644 --- a/sys/sys/mbuf.h +++ b/sys/sys/mbuf.h @@ -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 diff --git a/sys/vfs/nfs/krpc_subr.c b/sys/vfs/nfs/krpc_subr.c index 876adfa2f5..30f08ab470 100644 --- a/sys/vfs/nfs/krpc_subr.c +++ b/sys/vfs/nfs/krpc_subr.c @@ -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); diff --git a/sys/vfs/nfs/nfs_serv.c b/sys/vfs/nfs/nfs_serv.c index 14ac4192c9..318f5cfaec 100644 --- a/sys/vfs/nfs/nfs_serv.c +++ b/sys/vfs/nfs/nfs_serv.c @@ -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; diff --git a/sys/vfs/nfs/nfs_socket.c b/sys/vfs/nfs/nfs_socket.c index bb8ab45d70..c0cb85f48f 100644 --- a/sys/vfs/nfs/nfs_socket.c +++ b/sys/vfs/nfs/nfs_socket.c @@ -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; } diff --git a/sys/vfs/nfs/nfs_subs.c b/sys/vfs/nfs/nfs_subs.c index 1fe390387c..758c2bf064 100644 --- a/sys/vfs/nfs/nfs_subs.c +++ b/sys/vfs/nfs/nfs_subs.c @@ -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 *); diff --git a/sys/vfs/nfs/nfsm_subs.h b/sys/vfs/nfs/nfsm_subs.h index be394ebd19..592208e7f1 100644 --- a/sys/vfs/nfs/nfsm_subs.h +++ b/sys/vfs/nfs/nfsm_subs.h @@ -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); \