X-Git-Url: https://git.subgeniuskitty.com/unix-history/.git/blobdiff_plain/e495e1ccd06185fbec39733a5598dd424ec9e7f5..88a7a62ac37860454424240400aa10e0319144c7:/usr/src/sys/kern/uipc_mbuf.c diff --git a/usr/src/sys/kern/uipc_mbuf.c b/usr/src/sys/kern/uipc_mbuf.c index 1d7dc646ed..11f5f9b982 100644 --- a/usr/src/sys/kern/uipc_mbuf.c +++ b/usr/src/sys/kern/uipc_mbuf.c @@ -1,25 +1,23 @@ -/* uipc_mbuf.c 1.30 82/03/09 */ +/* uipc_mbuf.c 1.43 83/05/27 */ + +#include "../machine/pte.h" #include "../h/param.h" #include "../h/dir.h" #include "../h/user.h" #include "../h/proc.h" -#include "../h/pte.h" #include "../h/cmap.h" #include "../h/map.h" #include "../h/mbuf.h" -#include "../net/in_systm.h" /* XXX */ #include "../h/vm.h" +#include "../h/kernel.h" mbinit() { -COUNT(MBINIT); - if (m_reserve(32) == 0) - goto bad; - if (m_clalloc(4, MPG_MBUFS) == 0) + if (m_clalloc(4096/CLBYTES, MPG_MBUFS) == 0) goto bad; - if (m_clalloc(32, MPG_CLUSTERS) == 0) + if (m_clalloc(8*4096/CLBYTES, MPG_CLUSTERS) == 0) goto bad; return; bad: @@ -36,16 +34,19 @@ m_clalloc(ncl, how) register int i; int s; -COUNT(M_CLALLOC); npg = ncl * CLSIZE; s = splimp(); /* careful: rmalloc isn't reentrant */ - mbx = rmalloc(mbmap, npg); + mbx = rmalloc(mbmap, (long)npg); splx(s); if (mbx == 0) return (0); m = cltom(mbx / CLSIZE); - if (memall(&Mbmap[mbx], ncl * CLSIZE, proc, CSYS) == 0) + if (memall(&Mbmap[mbx], npg, proc, CSYS) == 0) { + s = splimp(); + rmfree(mbmap, (long)npg, (long)mbx); + splx(s); return (0); + } vmaccess(&Mbmap[mbx], (caddr_t)m, npg); switch (how) { @@ -56,7 +57,7 @@ COUNT(M_CLALLOC); m->m_next = mclfree; mclfree = m; m += CLBYTES / sizeof (*m); - nmclfree++; + mbstat.m_clfree++; } mbstat.m_clusters += ncl; splx(s); @@ -65,11 +66,12 @@ COUNT(M_CLALLOC); case MPG_MBUFS: for (i = ncl * CLBYTES / sizeof (*m); i > 0; i--) { m->m_off = 0; - m->m_free = 0; + m->m_type = MT_DATA; + mbstat.m_mtypes[MT_DATA]++; + mbstat.m_mbufs++; (void) m_free(m); m++; } - mbstat.m_clusters += ncl; break; } return ((caddr_t)m); @@ -80,15 +82,14 @@ m_pgfree(addr, n) int n; { -COUNT(M_PGFREE); +#ifdef lint + addr = addr; n = n; +#endif } m_expand() { -COUNT(M_EXPAND); - if (mbstat.m_bufs >= mbstat.m_hiwat) - return (0); if (m_clalloc(1, MPG_MBUFS) == 0) goto steal; return (1); @@ -99,55 +100,30 @@ steal: /* NEED SOME WAY TO RELEASE SPACE */ -/* - * Space reservation routines - */ -m_reserve(mbufs) - int mbufs; -{ - - if (mbstat.m_lowat + (mbufs>>1) > (NMBCLUSTERS-32) * CLBYTES) - return (0); - mbstat.m_hiwat += mbufs; - mbstat.m_lowat = mbstat.m_hiwat >> 1; - return (1); -} - -m_release(mbufs) - int mbufs; -{ - - mbstat.m_hiwat -= mbufs; - mbstat.m_lowat = mbstat.m_hiwat >> 1; -} - /* * Space allocation routines. * These are also available as macros * for critical paths. */ struct mbuf * -m_get(canwait) - int canwait; +m_get(canwait, type) + int canwait, type; { register struct mbuf *m; -COUNT(M_GET); - MGET(m, canwait); + MGET(m, canwait, type); return (m); } struct mbuf * -m_getclr(canwait) - int canwait; +m_getclr(canwait, type) + int canwait, type; { register struct mbuf *m; -COUNT(M_GETCLR); - m = m_get(canwait); + m = m_get(canwait, type); if (m == 0) return (0); - m->m_off = MMINOFF; bzero(mtod(m, caddr_t), MLEN); return (m); } @@ -158,25 +134,23 @@ m_free(m) { register struct mbuf *n; -COUNT(M_FREE); MFREE(m, n); return (n); } /*ARGSUSED*/ struct mbuf * -m_more(type) - int type; +m_more(canwait, type) + int canwait, type; { register struct mbuf *m; -COUNT(M_MORE); if (!m_expand()) { mbstat.m_drops++; return (NULL); } -#define m_more(x) (panic("m_more"), (struct mbuf *)0) - MGET(m, type); +#define m_more(x,y) (panic("m_more"), (struct mbuf *)0) + MGET(m, canwait, type); #undef m_more return (m); } @@ -187,7 +161,6 @@ m_freem(m) register struct mbuf *n; register int s; -COUNT(M_FREEM); if (m == NULL) return; s = splimp(); @@ -208,12 +181,13 @@ m_copy(m, off, len) { register struct mbuf *n, **np; struct mbuf *top, *p; -COUNT(M_COPY); + int type; if (len == 0) return (0); if (off < 0 || len < 0) panic("m_copy"); + type = m->m_type; while (off > 0) { if (m == 0) panic("m_copy"); @@ -230,7 +204,7 @@ COUNT(M_COPY); panic("m_copy"); break; } - MGET(n, 1); + MGET(n, M_WAIT, type); *np = n; if (n == 0) goto nospace; @@ -239,11 +213,9 @@ COUNT(M_COPY); p = mtod(m, struct mbuf *); n->m_off = ((int)p - (int)n) + off; mclrefcnt[mtocl(p)]++; - } else { - n->m_off = MMINOFF; + } else bcopy(mtod(m, caddr_t)+off, mtod(n, caddr_t), (unsigned)n->m_len); - } if (len != M_COPYALL) len -= n->m_len; off = 0; @@ -282,7 +254,6 @@ m_adj(mp, len) { register struct mbuf *m, *n; -COUNT(M_ADJ); if ((m = mp) == NULL) return; if (len >= 0) { @@ -323,25 +294,25 @@ m_pullup(m0, len) int len; { register struct mbuf *m, *n; - int cnt; + int count; n = m0; if (len > MLEN) goto bad; - MGET(m, 0); + MGET(m, M_DONTWAIT, n->m_type); if (m == 0) goto bad; - m->m_off = MMINOFF; m->m_len = 0; do { - cnt = MIN(MLEN - m->m_len, len); - if (cnt > n->m_len) - cnt = n->m_len; - bcopy(mtod(n, caddr_t), mtod(m, caddr_t)+m->m_len, cnt); - len -= cnt; - m->m_len += cnt; - n->m_off += cnt; - n->m_len -= cnt; + count = MIN(MLEN - m->m_len, len); + if (count > n->m_len) + count = n->m_len; + bcopy(mtod(n, caddr_t), mtod(m, caddr_t)+m->m_len, + (unsigned)count); + len -= count; + m->m_len += count; + n->m_off += count; + n->m_len -= count; if (n->m_len) break; n = m_free(n);