On Fri, Jul 07, 2023 at 12:31:02PM +0300, YASUOKA Masahiko wrote: > Hi, > > I'd like to expand the counters in struct mbstat from u_short to u_long. > > When I was debugging a mbuf leak, I saw the result of "netstat -m" > --- > 28647 mbufs in use: > 28551 mbufs allocated to data > 4 mbufs allocated to packet headers > 92 mbufs allocated to socket names and addresses > 159506/160736 mbuf 2048 byte clusters in use (current/peak) > 0/30 mbuf 2112 byte clusters in use (current/peak) > 0/24 mbuf 4096 byte clusters in use (current/peak) > 0/24 mbuf 8192 byte clusters in use (current/peak) > 0/0 mbuf 9216 byte clusters in use (current/peak) > 0/0 mbuf 12288 byte clusters in use (current/peak) > 0/16 mbuf 16384 byte clusters in use (current/peak) > 0/0 mbuf 65536 byte clusters in use (current/peak) > 360980/362484/2097152 Kbytes allocated to network (current/peak/max) > 0 requests for memory denied > 0 requests for memory delayed > 0 calls to protocol drain routines > --- > > I couldn't figure out why mcl2k is leaked without leaking mbuf for few > days. Actually it was shown in u_short (actual number % 65535). > > > ok? comments?
OK bluhm@ > Index: sys/sys/mbuf.h > =================================================================== > RCS file: /disk/cvs/openbsd/src/sys/sys/mbuf.h,v > retrieving revision 1.259 > diff -u -p -r1.259 mbuf.h > --- sys/sys/mbuf.h 4 Jul 2023 09:47:51 -0000 1.259 > +++ sys/sys/mbuf.h 6 Jul 2023 14:36:15 -0000 > @@ -372,7 +372,7 @@ struct mbstat { > u_long m_drops; /* times failed to find space */ > u_long m_wait; /* times waited for space */ > u_long m_drain; /* times drained protocols for space */ > - u_short m_mtypes[256]; /* type specific mbuf allocations */ > + u_long m_mtypes[256]; /* type specific mbuf allocations */ > }; > > #define MBSTAT_TYPES MT_NTYPES > Index: sys/kern/kern_sysctl.c > =================================================================== > RCS file: /disk/cvs/openbsd/src/sys/kern/kern_sysctl.c,v > retrieving revision 1.416 > diff -u -p -r1.416 kern_sysctl.c > --- sys/kern/kern_sysctl.c 2 Jul 2023 19:02:27 -0000 1.416 > +++ sys/kern/kern_sysctl.c 6 Jul 2023 14:36:15 -0000 > @@ -515,20 +515,22 @@ kern_sysctl(int *name, u_int namelen, vo > case KERN_MBSTAT: { > extern struct cpumem *mbstat; > uint64_t counters[MBSTAT_COUNT]; > - struct mbstat mbs; > + struct mbstat *mbs; > unsigned int i; > + int ret; > > - memset(&mbs, 0, sizeof(mbs)); > + mbs = malloc(sizeof(*mbs), M_TEMP, M_WAITOK | M_ZERO); > counters_read(mbstat, counters, MBSTAT_COUNT); > for (i = 0; i < MBSTAT_TYPES; i++) > - mbs.m_mtypes[i] = counters[i]; > + mbs->m_mtypes[i] = counters[i]; > > - mbs.m_drops = counters[MBSTAT_DROPS]; > - mbs.m_wait = counters[MBSTAT_WAIT]; > - mbs.m_drain = counters[MBSTAT_DRAIN]; > + mbs->m_drops = counters[MBSTAT_DROPS]; > + mbs->m_wait = counters[MBSTAT_WAIT]; > + mbs->m_drain = counters[MBSTAT_DRAIN]; > > - return (sysctl_rdstruct(oldp, oldlenp, newp, > - &mbs, sizeof(mbs))); > + ret = sysctl_rdstruct(oldp, oldlenp, newp, mbs, sizeof(*mbs)); > + free(mbs, M_TEMP, sizeof(*mbs)); > + return (ret); > } > case KERN_MSGBUFSIZE: > case KERN_CONSBUFSIZE: { > Index: usr.bin/netstat/mbuf.c > =================================================================== > RCS file: /disk/cvs/openbsd/src/usr.bin/netstat/mbuf.c,v > retrieving revision 1.43 > diff -u -p -r1.43 mbuf.c > --- usr.bin/netstat/mbuf.c 16 Jul 2019 17:39:02 -0000 1.43 > +++ usr.bin/netstat/mbuf.c 6 Jul 2023 14:36:15 -0000 > @@ -78,7 +78,7 @@ static struct mbtypes { > { 0, 0 } > }; > > -int nmbtypes = sizeof(mbstat.m_mtypes) / sizeof(short); > +int nmbtypes = sizeof(mbstat.m_mtypes) / sizeof(u_long); > bool seen[256]; /* "have we seen this type yet?" */ > > /* > @@ -172,7 +172,7 @@ mbpr(void) > for (mp = mbtypes; mp->mt_name; mp++) > if (mbstat.m_mtypes[mp->mt_type]) { > seen[mp->mt_type] = YES; > - printf("\t%u mbuf%s allocated to %s\n", > + printf("\t%lu mbuf%s allocated to %s\n", > mbstat.m_mtypes[mp->mt_type], > plural(mbstat.m_mtypes[mp->mt_type]), > mp->mt_name); > @@ -180,7 +180,7 @@ mbpr(void) > seen[MT_FREE] = YES; > for (i = 0; i < nmbtypes; i++) > if (!seen[i] && mbstat.m_mtypes[i]) { > - printf("\t%u mbuf%s allocated to <mbuf type %d>\n", > + printf("\t%lu mbuf%s allocated to <mbuf type %d>\n", > mbstat.m_mtypes[i], > plural(mbstat.m_mtypes[i]), i); > }