On Sun, Jul 09, 2023 at 10:25:46AM +0300, YASUOKA Masahiko wrote:
> On Sat, 08 Jul 2023 21:58:30 +0300 (EEST)
> YASUOKA Masahiko <yasu...@openbsd.org> wrote:
> > The diff makes the mbstat be the same size which is actually used.
> > Also revert the previous that the mbstat is located on the stack.
> 
> The userland program also needed to be changed.
> 
> ok?

The code in netstat still has some more 256 bits:

bool seen[256];                 /* "have we seen this type yet?" */

I guess that can be fixed once this is in tree.
The diff is OK claudio@
 
> Index: sys/kern/kern_sysctl.c
> ===================================================================
> RCS file: /cvs/src/sys/kern/kern_sysctl.c,v
> retrieving revision 1.417
> diff -u -p -r1.417 kern_sysctl.c
> --- sys/kern/kern_sysctl.c    7 Jul 2023 16:27:46 -0000       1.417
> +++ sys/kern/kern_sysctl.c    9 Jul 2023 07:22:58 -0000
> @@ -515,22 +515,20 @@ 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;
>  
> -             mbs = malloc(sizeof(*mbs), M_TEMP, M_WAITOK | M_ZERO);
> +             memset(&mbs, 0, sizeof(mbs));
>               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];
>  
> -             ret = sysctl_rdstruct(oldp, oldlenp, newp, mbs, sizeof(*mbs));
> -             free(mbs, M_TEMP, sizeof(*mbs));
> -             return (ret);
> +             return (sysctl_rdstruct(oldp, oldlenp, newp,
> +                 &mbs, sizeof(mbs)));
>       }
>       case KERN_MSGBUFSIZE:
>       case KERN_CONSBUFSIZE: {
> Index: sys/sys/mbuf.h
> ===================================================================
> RCS file: /cvs/src/sys/sys/mbuf.h,v
> retrieving revision 1.260
> diff -u -p -r1.260 mbuf.h
> --- sys/sys/mbuf.h    7 Jul 2023 14:17:34 -0000       1.260
> +++ sys/sys/mbuf.h    9 Jul 2023 07:22:58 -0000
> @@ -363,6 +363,12 @@ u_int mextfree_register(void (*)(caddr_t
>  /* length to m_copy to copy all */
>  #define      M_COPYALL       1000000000
>  
> +#define MBSTAT_TYPES           MT_NTYPES
> +#define MBSTAT_DROPS           (MBSTAT_TYPES + 0)
> +#define MBSTAT_WAIT            (MBSTAT_TYPES + 1)
> +#define MBSTAT_DRAIN           (MBSTAT_TYPES + 2)
> +#define MBSTAT_COUNT           (MBSTAT_TYPES + 3)
> +
>  /*
>   * Mbuf statistics.
>   * For statistics related to mbuf and cluster allocations, see also the
> @@ -372,14 +378,9 @@ 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_long  m_mtypes[256];  /* type specific mbuf allocations */
> +     u_long  m_mtypes[MBSTAT_COUNT];
> +                             /* type specific mbuf allocations */
>  };
> -
> -#define MBSTAT_TYPES           MT_NTYPES
> -#define MBSTAT_DROPS           (MBSTAT_TYPES + 0)
> -#define MBSTAT_WAIT            (MBSTAT_TYPES + 1)
> -#define MBSTAT_DRAIN           (MBSTAT_TYPES + 2)
> -#define MBSTAT_COUNT           (MBSTAT_TYPES + 3)
>  
>  #include <sys/mutex.h>
>  
> Index: usr.bin/netstat/mbuf.c
> ===================================================================
> RCS file: /cvs/src/usr.bin/netstat/mbuf.c,v
> retrieving revision 1.44
> diff -u -p -r1.44 mbuf.c
> --- usr.bin/netstat/mbuf.c    7 Jul 2023 14:17:35 -0000       1.44
> +++ usr.bin/netstat/mbuf.c    9 Jul 2023 07:22:58 -0000
> @@ -93,7 +93,7 @@ mbpr(void)
>       struct mbtypes *mp;
>       size_t size;
>  
> -     if (nmbtypes != 256) {
> +     if (nmbtypes != MBSTAT_COUNT) {
>               fprintf(stderr,
>                   "%s: unexpected change to mbstat; check source\n",
>                   __progname);
> 
> 
> 
> 

-- 
:wq Claudio

Reply via email to