In order to reduce use of M_EXT outside of the mbuf allocator and
socket-buffer implementations, introduce a return value for MCLGET() (and m_cljget() that underlies it) to allow the caller to avoid testing M_EXT itself. Update all callers to use the return value. With this change, very few network device drivers remain aware of M_EXT; the primary exceptions lie in mbuf-chain pretty printers for debugging, and in a few cases, custom mbuf and cluster allocation implementations. NB: This is a difficult-to-test change as it touches many drivers for which I don't have physical devices. Instead we've gone for intensive review, but further post-commit review would definitely be appreciated to spot errors where changes could not easily be made mechanically, but were largely mechanical in nature. Differential Revision: https://reviews.freebsd.org/D1440 Reviewed by: adrian, bz, gnn Sponsored by: EMC / Isilon Storage Division
This commit is contained in:
parent
ff9d81bf5b
commit
60909669f0
@ -24,7 +24,7 @@
|
||||
.\"
|
||||
.\" $FreeBSD$
|
||||
.\"
|
||||
.Dd October 21, 2014
|
||||
.Dd January 5, 2015
|
||||
.Dt MBUF 9
|
||||
.Os
|
||||
.\"
|
||||
@ -40,6 +40,7 @@
|
||||
.Ss Mbuf allocation macros
|
||||
.Fn MGET "struct mbuf *mbuf" "int how" "short type"
|
||||
.Fn MGETHDR "struct mbuf *mbuf" "int how" "short type"
|
||||
.Ft int
|
||||
.Fn MCLGET "struct mbuf *mbuf" "int how"
|
||||
.Fo MEXTADD
|
||||
.Fa "struct mbuf *mbuf"
|
||||
@ -436,10 +437,12 @@ Allocate and attach an
|
||||
.Vt mbuf cluster
|
||||
to
|
||||
.Fa mbuf .
|
||||
If the macro fails, the
|
||||
On success, a non-zero value returned; otherwise, 0.
|
||||
Historically, consumers would check for success by testing the
|
||||
.Dv M_EXT
|
||||
flag will not be set in
|
||||
.Fa mbuf .
|
||||
flag on the mbuf, but this is now discouraged to avoid unnecessary awareness
|
||||
of the implementation of external storage in protocol stacks and device
|
||||
drivers.
|
||||
.It Fn M_ALIGN mbuf len
|
||||
Set the pointer
|
||||
.Fa mbuf->m_data
|
||||
|
@ -386,8 +386,7 @@ ipf_send_reset(fin)
|
||||
if (m == NULL)
|
||||
return -1;
|
||||
if (sizeof(*tcp2) + hlen > MLEN) {
|
||||
MCLGET(m, M_NOWAIT);
|
||||
if ((m->m_flags & M_EXT) == 0) {
|
||||
if (!(MCLGET(m, M_NOWAIT))) {
|
||||
FREE_MB_T(m);
|
||||
return -1;
|
||||
}
|
||||
@ -610,8 +609,7 @@ ipf_send_icmp_err(type, fin, dst)
|
||||
code = icmptoicmp6unreach[code];
|
||||
|
||||
if (iclen + max_linkhdr + fin->fin_plen > avail) {
|
||||
MCLGET(m, M_NOWAIT);
|
||||
if ((m->m_flags & M_EXT) == 0) {
|
||||
if (!(MCLGET(m, M_NOWAIT))) {
|
||||
FREE_MB_T(m);
|
||||
return -1;
|
||||
}
|
||||
|
@ -943,8 +943,7 @@ an_rxeof(struct an_softc *sc)
|
||||
if_inc_counter(ifp, IFCOUNTER_IERRORS, 1);
|
||||
return;
|
||||
}
|
||||
MCLGET(m, M_NOWAIT);
|
||||
if (!(m->m_flags & M_EXT)) {
|
||||
if (!(MCLGET(m, M_NOWAIT))) {
|
||||
m_freem(m);
|
||||
if_inc_counter(ifp, IFCOUNTER_IERRORS, 1);
|
||||
return;
|
||||
@ -1034,8 +1033,7 @@ an_rxeof(struct an_softc *sc)
|
||||
if_inc_counter(ifp, IFCOUNTER_IERRORS, 1);
|
||||
return;
|
||||
}
|
||||
MCLGET(m, M_NOWAIT);
|
||||
if (!(m->m_flags & M_EXT)) {
|
||||
if (!(MCLGET(m, M_NOWAIT))) {
|
||||
m_freem(m);
|
||||
if_inc_counter(ifp, IFCOUNTER_IERRORS, 1);
|
||||
return;
|
||||
|
@ -1383,8 +1383,7 @@ bge_newbuf_jumbo(struct bge_softc *sc, int i)
|
||||
if (m == NULL)
|
||||
return (ENOBUFS);
|
||||
|
||||
m_cljget(m, M_NOWAIT, MJUM9BYTES);
|
||||
if (!(m->m_flags & M_EXT)) {
|
||||
if (m_cljget(m, M_NOWAIT, MJUM9BYTES) == NULL) {
|
||||
m_freem(m);
|
||||
return (ENOBUFS);
|
||||
}
|
||||
|
@ -307,8 +307,7 @@ static struct mbuf *makembuf (void *buf, unsigned len)
|
||||
MGETHDR (m, M_NOWAIT, MT_DATA);
|
||||
if (! m)
|
||||
return 0;
|
||||
MCLGET (m, M_NOWAIT);
|
||||
if (! (m->m_flags & M_EXT)) {
|
||||
if (!(MCLGET(m, M_NOWAIT))) {
|
||||
m_freem (m);
|
||||
return 0;
|
||||
}
|
||||
|
@ -540,10 +540,7 @@ cm_srint_locked(vsc)
|
||||
*/
|
||||
if ((len + 2 + 2) > MHLEN) {
|
||||
/* attach an mbuf cluster */
|
||||
MCLGET(m, M_NOWAIT);
|
||||
|
||||
/* Insist on getting a cluster */
|
||||
if ((m->m_flags & M_EXT) == 0) {
|
||||
if (!(MCLGET(m, M_NOWAIT))) {
|
||||
if_inc_counter(ifp, IFCOUNTER_IERRORS, 1);
|
||||
goto cleanup;
|
||||
}
|
||||
|
@ -191,8 +191,7 @@ static struct mbuf *makembuf (void *buf, unsigned len)
|
||||
MGETHDR (m, M_NOWAIT, MT_DATA);
|
||||
if (! m)
|
||||
return 0;
|
||||
MCLGET (m, M_NOWAIT);
|
||||
if (! (m->m_flags & M_EXT)) {
|
||||
if (!(MCLGET (m, M_NOWAIT))) {
|
||||
m_freem (m);
|
||||
return 0;
|
||||
}
|
||||
|
@ -716,8 +716,7 @@ cs_get_packet(struct cs_softc *sc)
|
||||
return (-1);
|
||||
|
||||
if (length > MHLEN) {
|
||||
MCLGET(m, M_NOWAIT);
|
||||
if (!(m->m_flags & M_EXT)) {
|
||||
if (!(MCLGET(m, M_NOWAIT))) {
|
||||
m_freem(m);
|
||||
return (-1);
|
||||
}
|
||||
|
@ -194,8 +194,7 @@ static struct mbuf *makembuf (void *buf, u_int len)
|
||||
MGETHDR (m, M_NOWAIT, MT_DATA);
|
||||
if (! m)
|
||||
return 0;
|
||||
MCLGET (m, M_NOWAIT);
|
||||
if (! (m->m_flags & M_EXT)) {
|
||||
if (!(MCLGET(m, M_NOWAIT))) {
|
||||
m_freem (m);
|
||||
return 0;
|
||||
}
|
||||
|
@ -1323,10 +1323,7 @@ ed_get_packet(struct ed_softc *sc, bus_size_t buf, u_short len)
|
||||
*/
|
||||
if ((len + 2) > MHLEN) {
|
||||
/* Attach an mbuf cluster */
|
||||
MCLGET(m, M_NOWAIT);
|
||||
|
||||
/* Insist on getting a cluster */
|
||||
if ((m->m_flags & M_EXT) == 0) {
|
||||
if (!(MCLGET(m, M_NOWAIT))) {
|
||||
m_freem(m);
|
||||
return;
|
||||
}
|
||||
|
@ -745,8 +745,7 @@ ex_rx_intr(struct ex_softc *sc)
|
||||
|
||||
while (pkt_len > 0) {
|
||||
if (pkt_len >= MINCLSIZE) {
|
||||
MCLGET(m, M_NOWAIT);
|
||||
if (m->m_flags & M_EXT) {
|
||||
if (MCLGET(m, M_NOWAIT)) {
|
||||
m->m_len = MCLBYTES;
|
||||
} else {
|
||||
m_freem(ipkt);
|
||||
|
@ -1880,8 +1880,7 @@ fe_get_packet (struct fe_softc * sc, u_short len)
|
||||
|
||||
/* Attach a cluster if this packet doesn't fit in a normal mbuf. */
|
||||
if (len > MHLEN - NFS_MAGIC_OFFSET) {
|
||||
MCLGET(m, M_NOWAIT);
|
||||
if (!(m->m_flags & M_EXT)) {
|
||||
if (!(MCLGET(m, M_NOWAIT))) {
|
||||
m_freem(m);
|
||||
return -1;
|
||||
}
|
||||
|
@ -1890,8 +1890,7 @@ hifn_crypto(
|
||||
goto err_srcmap;
|
||||
}
|
||||
if (totlen >= MINCLSIZE) {
|
||||
MCLGET(m0, M_NOWAIT);
|
||||
if ((m0->m_flags & M_EXT) == 0) {
|
||||
if (!(MCLGET(m0, M_NOWAIT))) {
|
||||
hifnstats.hst_nomem_mcl++;
|
||||
err = sc->sc_cmdu ? ERESTART : ENOMEM;
|
||||
m_freem(m0);
|
||||
@ -1913,8 +1912,7 @@ hifn_crypto(
|
||||
}
|
||||
len = MLEN;
|
||||
if (totlen >= MINCLSIZE) {
|
||||
MCLGET(m, M_NOWAIT);
|
||||
if ((m->m_flags & M_EXT) == 0) {
|
||||
if (!(MCLGET(m, M_NOWAIT))) {
|
||||
hifnstats.hst_nomem_mcl++;
|
||||
err = sc->sc_cmdu ? ERESTART : ENOMEM;
|
||||
mlast->m_next = m;
|
||||
|
@ -728,8 +728,7 @@ ieget(struct ie_softc *sc, struct mbuf **mp)
|
||||
m->m_len = MLEN;
|
||||
}
|
||||
if (resid >= MINCLSIZE) {
|
||||
MCLGET(m, M_NOWAIT);
|
||||
if (m->m_flags & M_EXT)
|
||||
if (MCLGET(m, M_NOWAIT))
|
||||
m->m_len = min(resid, MCLBYTES);
|
||||
} else {
|
||||
if (resid < m->m_len) {
|
||||
|
@ -398,8 +398,7 @@ lance_get(struct lance_softc *sc, int boff, int totlen)
|
||||
|
||||
while (totlen > 0) {
|
||||
if (totlen >= MINCLSIZE) {
|
||||
MCLGET(m, M_NOWAIT);
|
||||
if ((m->m_flags & M_EXT) == 0)
|
||||
if (!(MCLGET(m, M_NOWAIT)))
|
||||
goto bad;
|
||||
len = MCLBYTES;
|
||||
}
|
||||
|
@ -2689,8 +2689,7 @@ rxintr_setup(softc_t *sc)
|
||||
printf("%s: rxintr_setup: MGETHDR() failed\n", NAME_UNIT);
|
||||
return 0;
|
||||
}
|
||||
MCLGET(m, M_NOWAIT);
|
||||
if ((m->m_flags & M_EXT) == 0)
|
||||
if (!(MCLGET(m, M_NOWAIT)))
|
||||
{
|
||||
m_freem(m);
|
||||
sc->status.cntrs.rxdma++;
|
||||
|
@ -1165,8 +1165,7 @@ mn_rx_intr(struct mn_softc *sc, u_int32_t vector)
|
||||
mn_free_desc(dp);
|
||||
return; /* ENOBUFS */
|
||||
}
|
||||
MCLGET(m, M_NOWAIT);
|
||||
if((m->m_flags & M_EXT) == 0) {
|
||||
if (!(MCLGET(m, M_NOWAIT))) {
|
||||
mn_free_desc(dp);
|
||||
m_freem(m);
|
||||
return; /* ENOBUFS */
|
||||
|
@ -1085,8 +1085,7 @@ my_newbuf(struct my_softc * sc, struct my_chain_onefrag * c)
|
||||
"no memory for rx list -- packet dropped!\n");
|
||||
return (ENOBUFS);
|
||||
}
|
||||
MCLGET(m_new, M_NOWAIT);
|
||||
if (!(m_new->m_flags & M_EXT)) {
|
||||
if (!(MCLGET(m_new, M_NOWAIT))) {
|
||||
device_printf(sc->my_dev,
|
||||
"no memory for rx list -- packet dropped!\n");
|
||||
m_freem(m_new);
|
||||
@ -1352,8 +1351,7 @@ my_encap(struct my_softc * sc, struct my_chain * c, struct mbuf * m_head)
|
||||
return (1);
|
||||
}
|
||||
if (m_head->m_pkthdr.len > MHLEN) {
|
||||
MCLGET(m_new, M_NOWAIT);
|
||||
if (!(m_new->m_flags & M_EXT)) {
|
||||
if (!(MCLGET(m_new, M_NOWAIT))) {
|
||||
m_freem(m_new);
|
||||
device_printf(sc->my_dev, "no memory for tx list");
|
||||
return (1);
|
||||
|
@ -803,8 +803,7 @@ pcn_newbuf(sc, idx, m)
|
||||
if (m_new == NULL)
|
||||
return(ENOBUFS);
|
||||
|
||||
MCLGET(m_new, M_NOWAIT);
|
||||
if (!(m_new->m_flags & M_EXT)) {
|
||||
if (!(MCLGET(m_new, M_NOWAIT))) {
|
||||
m_freem(m_new);
|
||||
return(ENOBUFS);
|
||||
}
|
||||
|
@ -190,8 +190,7 @@ typedef struct _pdq_os_ctx_t {
|
||||
PDQ_OS_DATABUF_T *x_m0; \
|
||||
MGETHDR(x_m0, M_NOWAIT, MT_DATA); \
|
||||
if (x_m0 != NULL) { \
|
||||
MCLGET(x_m0, M_NOWAIT); \
|
||||
if ((x_m0->m_flags & M_EXT) == 0) { \
|
||||
if (!(MCLGET(x_m0, M_NOWAIT))) { \
|
||||
m_free(x_m0); \
|
||||
(b) = NULL; \
|
||||
} else { \
|
||||
|
@ -748,8 +748,7 @@ pdq_os_databuf_alloc(
|
||||
printf("%s: can't alloc small buf\n", sc->sc_dev.dv_xname);
|
||||
return NULL;
|
||||
}
|
||||
MCLGET(m, M_NOWAIT);
|
||||
if ((m->m_flags & M_EXT) == 0) {
|
||||
if (!(MCLGET(m, M_NOWAIT))) {
|
||||
printf("%s: can't alloc cluster\n", sc->sc_dev.dv_xname);
|
||||
m_free(m);
|
||||
return NULL;
|
||||
|
@ -216,8 +216,7 @@ typedef struct mbuf PDQ_OS_DATABUF_T;
|
||||
PDQ_OS_DATABUF_T *x_m0; \
|
||||
MGETHDR(x_m0, M_NOWAIT, MT_DATA); \
|
||||
if (x_m0 != NULL) { \
|
||||
MCLGET(x_m0, M_NOWAIT); \
|
||||
if ((x_m0->m_flags & M_EXT) == 0) { \
|
||||
if (!(MCLGET(x_m0, M_NOWAIT))) { \
|
||||
m_free(x_m0); \
|
||||
(b) = NULL; \
|
||||
} else { \
|
||||
|
@ -1328,8 +1328,7 @@ safe_process(device_t dev, struct cryptop *crp, int hint)
|
||||
goto errout;
|
||||
}
|
||||
if (totlen >= MINCLSIZE) {
|
||||
MCLGET(m, M_NOWAIT);
|
||||
if ((m->m_flags & M_EXT) == 0) {
|
||||
if (!(MCLGET(m, M_NOWAIT))) {
|
||||
m_free(m);
|
||||
safestats.st_nomcl++;
|
||||
err = sc->sc_nqchip ?
|
||||
@ -1355,8 +1354,7 @@ safe_process(device_t dev, struct cryptop *crp, int hint)
|
||||
len = MLEN;
|
||||
}
|
||||
if (top && totlen >= MINCLSIZE) {
|
||||
MCLGET(m, M_NOWAIT);
|
||||
if ((m->m_flags & M_EXT) == 0) {
|
||||
if (!(MCLGET(m, M_NOWAIT))) {
|
||||
*mp = m;
|
||||
m_freem(top);
|
||||
safestats.st_nomcl++;
|
||||
|
@ -878,8 +878,7 @@ get_rx_buf(struct sbni_softc *sc)
|
||||
*/
|
||||
if (ETHER_MAX_LEN + 2 > MHLEN) {
|
||||
/* Attach an mbuf cluster */
|
||||
MCLGET(m, M_NOWAIT);
|
||||
if ((m->m_flags & M_EXT) == 0) {
|
||||
if (!(MCLGET(m, M_NOWAIT))) {
|
||||
m_freem(m);
|
||||
return (0);
|
||||
}
|
||||
|
@ -693,8 +693,7 @@ smc_task_rx(void *context, int pending)
|
||||
if (m == NULL) {
|
||||
break;
|
||||
}
|
||||
MCLGET(m, M_NOWAIT);
|
||||
if ((m->m_flags & M_EXT) == 0) {
|
||||
if (!(MCLGET(m, M_NOWAIT))) {
|
||||
m_freem(m);
|
||||
break;
|
||||
}
|
||||
|
@ -1065,14 +1065,9 @@ read_another:
|
||||
m->m_pkthdr.len = m->m_len = packet_length;
|
||||
|
||||
/*
|
||||
* Attach an mbuf cluster
|
||||
* Attach an mbuf cluster.
|
||||
*/
|
||||
MCLGET(m, M_NOWAIT);
|
||||
|
||||
/*
|
||||
* Insist on getting a cluster
|
||||
*/
|
||||
if ((m->m_flags & M_EXT) == 0) {
|
||||
if (!(MCLGET(m, M_NOWAIT))) {
|
||||
m_freem(m);
|
||||
if_inc_counter(ifp, IFCOUNTER_IERRORS, 1);
|
||||
printf("sn: snread() kernel memory allocation problem\n");
|
||||
|
@ -1129,8 +1129,7 @@ sonic_get(struct snc_softc *sc, u_int32_t pkt, int datalen)
|
||||
len = MLEN;
|
||||
}
|
||||
if (datalen >= MINCLSIZE) {
|
||||
MCLGET(m, M_NOWAIT);
|
||||
if ((m->m_flags & M_EXT) == 0) {
|
||||
if (!(MCLGET(m, M_NOWAIT))) {
|
||||
if (top) m_freem(top);
|
||||
return (0);
|
||||
}
|
||||
|
@ -1596,8 +1596,7 @@ ti_newbuf_jumbo(struct ti_softc *sc, int idx, struct mbuf *m_old)
|
||||
"failed -- packet dropped!\n");
|
||||
goto nobufs;
|
||||
}
|
||||
MCLGET(m[NPAYLOAD], M_NOWAIT);
|
||||
if ((m[NPAYLOAD]->m_flags & M_EXT) == 0) {
|
||||
if (!(MCLGET(m[NPAYLOAD], M_NOWAIT))) {
|
||||
device_printf(sc->ti_dev, "mbuf allocation failed "
|
||||
"-- packet dropped!\n");
|
||||
goto nobufs;
|
||||
|
@ -1813,8 +1813,7 @@ tl_encap(sc, c, m_head)
|
||||
return(1);
|
||||
}
|
||||
if (m_head->m_pkthdr.len > MHLEN) {
|
||||
MCLGET(m_new, M_NOWAIT);
|
||||
if (!(m_new->m_flags & M_EXT)) {
|
||||
if (!(MCLGET(m_new, M_NOWAIT))) {
|
||||
m_freem(m_new);
|
||||
if_printf(ifp, "no memory for tx list\n");
|
||||
return(1);
|
||||
|
@ -417,9 +417,8 @@ udbp_bulk_read_callback(struct usb_xfer *xfer, usb_error_t error)
|
||||
if (m == NULL) {
|
||||
goto tr_setup;
|
||||
}
|
||||
MCLGET(m, M_NOWAIT);
|
||||
|
||||
if (!(m->m_flags & M_EXT)) {
|
||||
if (!(MCLGET(m, M_NOWAIT))) {
|
||||
m_freem(m);
|
||||
goto tr_setup;
|
||||
}
|
||||
|
@ -865,8 +865,7 @@ vx_get(struct vx_softc *sc, u_int totlen)
|
||||
len = MLEN;
|
||||
}
|
||||
if (totlen >= MINCLSIZE) {
|
||||
MCLGET(m, M_NOWAIT);
|
||||
if (m->m_flags & M_EXT)
|
||||
if (MCLGET(m, M_NOWAIT))
|
||||
len = MCLBYTES;
|
||||
}
|
||||
len = min(totlen, len);
|
||||
|
@ -1194,8 +1194,7 @@ wb_encap(sc, c, m_head)
|
||||
if (m_new == NULL)
|
||||
return(1);
|
||||
if (m_head->m_pkthdr.len > MHLEN) {
|
||||
MCLGET(m_new, M_NOWAIT);
|
||||
if (!(m_new->m_flags & M_EXT)) {
|
||||
if (!(MCLGET(m_new, M_NOWAIT))) {
|
||||
m_freem(m_new);
|
||||
return(1);
|
||||
}
|
||||
|
@ -765,8 +765,7 @@ xe_rxintr(struct xe_softc *scp, uint8_t rst0)
|
||||
}
|
||||
|
||||
if (len + 3 > MHLEN) {
|
||||
MCLGET(mbp, M_NOWAIT);
|
||||
if ((mbp->m_flags & M_EXT) == 0) {
|
||||
if (!(MCLGET(mbp, M_NOWAIT))) {
|
||||
m_freem(mbp);
|
||||
if_inc_counter(ifp, IFCOUNTER_IQDROPS, 1);
|
||||
continue;
|
||||
|
@ -822,8 +822,7 @@ network_alloc_rx_buffers(struct netfront_info *sc)
|
||||
goto no_mbuf;
|
||||
}
|
||||
|
||||
m_cljget(m_new, M_NOWAIT, MJUMPAGESIZE);
|
||||
if ((m_new->m_flags & M_EXT) == 0) {
|
||||
if (m_cljget(m_new, M_NOWAIT, MJUMPAGESIZE) == NULL) {
|
||||
printf("%s: m_cljget failed\n", __func__);
|
||||
m_freem(m_new);
|
||||
|
||||
|
@ -655,8 +655,7 @@ admsw_start(struct ifnet *ifp)
|
||||
break;
|
||||
}
|
||||
if (m0->m_pkthdr.len > MHLEN) {
|
||||
MCLGET(m, M_NOWAIT);
|
||||
if ((m->m_flags & M_EXT) == 0) {
|
||||
if (!(MCLGET(m, M_NOWAIT))) {
|
||||
device_printf(sc->sc_dev,
|
||||
"unable to allocate Tx cluster\n");
|
||||
m_freem(m);
|
||||
@ -1227,8 +1226,7 @@ admsw_add_rxbuf(struct admsw_softc *sc, int idx, int high)
|
||||
if (m == NULL)
|
||||
return (ENOBUFS);
|
||||
|
||||
MCLGET(m, M_NOWAIT);
|
||||
if ((m->m_flags & M_EXT) == 0) {
|
||||
if (!(MCLGET(m, M_NOWAIT))) {
|
||||
m_freem(m);
|
||||
return (ENOBUFS);
|
||||
}
|
||||
|
@ -151,8 +151,7 @@ uni_msg_pack_mbuf(struct uni_msg *msg, void *hdr, size_t hdrlen)
|
||||
|
||||
} else {
|
||||
if ((n = uni_msg_len(msg)) > MHLEN) {
|
||||
MCLGET(m0, M_NOWAIT);
|
||||
if (!(m0->m_flags & M_EXT))
|
||||
if (!(MCLGET(m0, M_NOWAIT)))
|
||||
goto drop;
|
||||
if (n > MCLBYTES)
|
||||
n = MCLBYTES;
|
||||
@ -173,8 +172,7 @@ uni_msg_pack_mbuf(struct uni_msg *msg, void *hdr, size_t hdrlen)
|
||||
last = m;
|
||||
|
||||
if (n > MLEN) {
|
||||
MCLGET(m, M_NOWAIT);
|
||||
if (!(m->m_flags & M_EXT))
|
||||
if (!(MCLGET(m, M_NOWAIT)))
|
||||
goto drop;
|
||||
if (n > MCLBYTES)
|
||||
n = MCLBYTES;
|
||||
|
@ -327,8 +327,7 @@ ng_sscop_mbuf_alloc(size_t n) \
|
||||
m->m_len = 0; \
|
||||
m->m_pkthdr.len = 0; \
|
||||
if (n > MHLEN) { \
|
||||
MCLGET(m, M_NOWAIT); \
|
||||
if (!(m->m_flags & M_EXT)){ \
|
||||
if (!(MCLGET(m, M_NOWAIT))){ \
|
||||
m_free(m); \
|
||||
m = NULL; \
|
||||
} \
|
||||
|
@ -814,8 +814,7 @@ bt3c_receive(bt3c_softc_p sc)
|
||||
break; /* XXX lost of sync */
|
||||
}
|
||||
|
||||
MCLGET(sc->m, M_NOWAIT);
|
||||
if (!(sc->m->m_flags & M_EXT)) {
|
||||
if (!(MCLGET(sc->m, M_NOWAIT))) {
|
||||
NG_FREE_M(sc->m);
|
||||
|
||||
NG_BT3C_ERR(sc->dev, "Could not get cluster\n");
|
||||
|
@ -816,8 +816,7 @@ ubt_intr_read_callback(struct usb_xfer *xfer, usb_error_t error)
|
||||
goto submit_next;
|
||||
}
|
||||
|
||||
MCLGET(m, M_NOWAIT);
|
||||
if (!(m->m_flags & M_EXT)) {
|
||||
if (!(MCLGET(m, M_NOWAIT))) {
|
||||
UBT_STAT_IERROR(sc);
|
||||
goto submit_next;
|
||||
}
|
||||
@ -916,8 +915,7 @@ ubt_bulk_read_callback(struct usb_xfer *xfer, usb_error_t error)
|
||||
goto submit_next;
|
||||
}
|
||||
|
||||
MCLGET(m, M_NOWAIT);
|
||||
if (!(m->m_flags & M_EXT)) {
|
||||
if (!(MCLGET(m, M_NOWAIT))) {
|
||||
UBT_STAT_IERROR(sc);
|
||||
goto submit_next;
|
||||
}
|
||||
@ -1126,8 +1124,7 @@ ubt_isoc_read_one_frame(struct usb_xfer *xfer, int frame_no)
|
||||
return (-1); /* XXX out of sync! */
|
||||
}
|
||||
|
||||
MCLGET(m, M_NOWAIT);
|
||||
if (!(m->m_flags & M_EXT)) {
|
||||
if (!(MCLGET(m, M_NOWAIT))) {
|
||||
UBT_STAT_IERROR(sc);
|
||||
NG_FREE_M(m);
|
||||
return (-1); /* XXX out of sync! */
|
||||
|
@ -484,8 +484,7 @@ ng_vjc_rcvdata(hook_p hook, item_p item)
|
||||
hm->m_len = 0;
|
||||
hm->m_pkthdr.rcvif = NULL;
|
||||
if (hlen > MHLEN) { /* unlikely, but can happen */
|
||||
MCLGET(hm, M_NOWAIT);
|
||||
if ((hm->m_flags & M_EXT) == 0) {
|
||||
if (!(MCLGET(hm, M_NOWAIT))) {
|
||||
m_freem(hm);
|
||||
priv->slc.sls_errorin++;
|
||||
NG_FREE_M(m);
|
||||
|
@ -2153,8 +2153,7 @@ key_spddelete2(struct socket *so, struct mbuf *m,
|
||||
|
||||
MGETHDR(n, M_NOWAIT, MT_DATA);
|
||||
if (n && len > MHLEN) {
|
||||
MCLGET(n, M_NOWAIT);
|
||||
if ((n->m_flags & M_EXT) == 0) {
|
||||
if (!(MCLGET(n, M_NOWAIT))) {
|
||||
m_freem(n);
|
||||
n = NULL;
|
||||
}
|
||||
@ -3496,8 +3495,7 @@ key_setsadbmsg(u_int8_t type, u_int16_t tlen, u_int8_t satype, u_int32_t seq,
|
||||
return NULL;
|
||||
MGETHDR(m, M_NOWAIT, MT_DATA);
|
||||
if (m && len > MHLEN) {
|
||||
MCLGET(m, M_NOWAIT);
|
||||
if ((m->m_flags & M_EXT) == 0) {
|
||||
if (!(MCLGET(m, M_NOWAIT))) {
|
||||
m_freem(m);
|
||||
m = NULL;
|
||||
}
|
||||
@ -4694,8 +4692,7 @@ key_getspi(struct socket *so, struct mbuf *m, const struct sadb_msghdr *mhp)
|
||||
|
||||
MGETHDR(n, M_NOWAIT, MT_DATA);
|
||||
if (len > MHLEN) {
|
||||
MCLGET(n, M_NOWAIT);
|
||||
if ((n->m_flags & M_EXT) == 0) {
|
||||
if (!(MCLGET(n, M_NOWAIT))) {
|
||||
m_freem(n);
|
||||
n = NULL;
|
||||
}
|
||||
@ -6628,8 +6625,7 @@ key_register(struct socket *so, struct mbuf *m, const struct sadb_msghdr *mhp)
|
||||
|
||||
MGETHDR(n, M_NOWAIT, MT_DATA);
|
||||
if (len > MHLEN) {
|
||||
MCLGET(n, M_NOWAIT);
|
||||
if ((n->m_flags & M_EXT) == 0) {
|
||||
if (!(MCLGET(n, M_NOWAIT))) {
|
||||
m_freem(n);
|
||||
n = NULL;
|
||||
}
|
||||
@ -7187,8 +7183,7 @@ key_parse(struct mbuf *m, struct socket *so)
|
||||
|
||||
MGETHDR(n, M_NOWAIT, MT_DATA);
|
||||
if (n && m->m_pkthdr.len > MHLEN) {
|
||||
MCLGET(n, M_NOWAIT);
|
||||
if ((n->m_flags & M_EXT) == 0) {
|
||||
if (!(MCLGET(n, M_NOWAIT))) {
|
||||
m_free(n);
|
||||
n = NULL;
|
||||
}
|
||||
|
@ -223,8 +223,7 @@ key_sendup(struct socket *so, struct sadb_msg *msg, u_int len, int target)
|
||||
n->m_len = MLEN;
|
||||
}
|
||||
if (tlen >= MCLBYTES) { /*XXX better threshold? */
|
||||
MCLGET(n, M_NOWAIT);
|
||||
if ((n->m_flags & M_EXT) == 0) {
|
||||
if (!(MCLGET(n, M_NOWAIT))) {
|
||||
m_free(n);
|
||||
m_freem(m);
|
||||
PFKEYSTAT_INC(in_nomem);
|
||||
|
@ -667,7 +667,7 @@ m_getcl(int how, short type, int flags)
|
||||
return (uma_zalloc_arg(zone_pack, &args, how));
|
||||
}
|
||||
|
||||
static __inline void
|
||||
static __inline int
|
||||
m_clget(struct mbuf *m, int how)
|
||||
{
|
||||
|
||||
@ -683,6 +683,7 @@ m_clget(struct mbuf *m, int how)
|
||||
zone_drain(zone_pack);
|
||||
uma_zalloc_arg(zone_clust, m, how);
|
||||
}
|
||||
return (m->m_flags & M_EXT);
|
||||
}
|
||||
|
||||
/*
|
||||
|
Loading…
x
Reference in New Issue
Block a user