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? 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); }