[PATCH 4/9] malloc: remove mallopt fastbin stats

DJ Delorie dj@redhat.com
Wed Nov 12 20:26:16 GMT 2025


Dev Jain <dev.jain@arm.com> writes:
> In preparation for removal of fastbins, remove all fastbin code from
> mallopt.

> diff --git a/malloc/malloc.c b/malloc/malloc.c
> index d78abe64fe..a1066cbc94 100644
> --- a/malloc/malloc.c
> +++ b/malloc/malloc.c
> @@ -659,12 +659,9 @@ void*  __libc_valloc(size_t);
>  
>    arena:     current total non-mmapped bytes allocated from system
>    ordblks:   the number of free chunks
> -  smblks:    the number of fastbin blocks (i.e., small chunks that
> -	       have been freed but not reused or consolidated)
>    hblks:     current number of mmapped regions
>    hblkhd:    total bytes held in mmapped regions
>    usmblks:   always 0
> -  fsmblks:   total bytes held in fastbin blocks
>    uordblks:  current total allocated space (normal or mmapped)
>    fordblks:  total free space
>    keepcost:  the maximum number of bytes that could ideally be released

Ok.

> @@ -5017,9 +5014,7 @@ int_mallinfo (mstate av, struct mallinfo2 *m)
>    mbinptr b;
>    mchunkptr p;
>    INTERNAL_SIZE_T avail;
> -  INTERNAL_SIZE_T fastavail;
>    int nblocks;
> -  int nfastblocks;

Ok.

>    avail = chunksize (av->top);
>    nblocks = 1;  /* top always exists */
>  
> -  /* traverse fastbins */
> -  nfastblocks = 0;
> -  fastavail = 0;
> -
> -  for (i = 0; i < NFASTBINS; ++i)
> -    {
> -      for (p = fastbin (av, i);
> -	   p != NULL;
> -	   p = REVEAL_PTR (p->fd))
> -        {
> -	  if (__glibc_unlikely (misaligned_chunk (p)))
> -	    malloc_printerr ("int_mallinfo(): "
> -			     "unaligned fastbin chunk detected");
> -          ++nfastblocks;
> -          fastavail += chunksize (p);
> -        }
> -    }
> -
> -  avail += fastavail;
> -

Ok.

>      }
>  
> -  m->smblks += nfastblocks;
>    m->ordblks += nblocks;
>    m->fordblks += avail;
>    m->uordblks += av->system_mem - avail;
>    m->arena += av->system_mem;
> -  m->fsmblks += fastavail;
>    if (av == &main_arena)

Ok.

>  
>    m.arena = m2.arena;
>    m.ordblks = m2.ordblks;
> -  m.smblks = m2.smblks;
>    m.hblks = m2.hblks;
>    m.hblkhd = m2.hblkhd;
>    m.usmblks = m2.usmblks;
> -  m.fsmblks = m2.fsmblks;
>    m.uordblks = m2.uordblks;
>    m.fordblks = m2.fordblks;
>    m.keepcost = m2.keepcost;

No, see below.

> diff --git a/malloc/malloc.h b/malloc/malloc.h
> index 6de9ee8a7a..042a56c567 100644
> --- a/malloc/malloc.h
> +++ b/malloc/malloc.h
> @@ -83,11 +83,9 @@ struct mallinfo
>  {
>    int arena;    /* non-mmapped space allocated from system */
>    int ordblks;  /* number of free chunks */
> -  int smblks;   /* number of fastbin blocks */
>    int hblks;    /* number of mmapped regions */
>    int hblkhd;   /* space in mmapped regions */
>    int usmblks;  /* always 0, preserved for backwards compatibility */
> -  int fsmblks;  /* space available in freed fastbin blocks */
>    int uordblks; /* total allocated space */
>    int fordblks; /* total free space */
>    int keepcost; /* top-most, releasable (via malloc_trim) space */
> @@ -100,11 +98,9 @@ struct mallinfo2
>  {
>    size_t arena;    /* non-mmapped space allocated from system */
>    size_t ordblks;  /* number of free chunks */
> -  size_t smblks;   /* number of fastbin blocks */
>    size_t hblks;    /* number of mmapped regions */
>    size_t hblkhd;   /* space in mmapped regions */
>    size_t usmblks;  /* always 0, preserved for backwards compatibility */
> -  size_t fsmblks;  /* space available in freed fastbin blocks */
>    size_t uordblks; /* total allocated space */
>    size_t fordblks; /* total free space */
>    size_t keepcost; /* top-most, releasable (via malloc_trim) space */

You can't do this, because it breaks backwards compatibility.  The best
you can do is leave the fields present but fill them with zeros.

> diff --git a/malloc/tst-mallinfo2.c b/malloc/tst-mallinfo2.c
> index 28ff6e2346..01b9e25ce4 100644
> --- a/malloc/tst-mallinfo2.c
> +++ b/malloc/tst-mallinfo2.c
> @@ -35,11 +35,9 @@ print_mi (const char *msg, struct mallinfo2 *m)
>  #define P(f) printf("%s: %zu\n", #f, m->f)
>    P(arena);
>    P(ordblks);
> -  P(smblks);
>    P(hblks);
>    P(hblkhd);
>    P(usmblks);
> -  P(fsmblks);
>    P(uordblks);
>    P(fordblks);
>    P(keepcost);

I could go either way on this; the fields will always be zero, but the
test can prove that they're always zero.



More information about the Libc-alpha mailing list