This is the mail archive of the libc-alpha@sourceware.org mailing list for the glibc project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

PING [patch] malloc: add mxfast tunable


https://www.sourceware.org/ml/libc-alpha/2018-11/msg00243.html

There was much bikeshedding about the name of the tunable, but no actual
patch review...

DJ Delorie <dj@redhat.com> writes:
> First pass at a tunable for MXFAST, which currently can only be
> changed by a call to mallopt().
>
> 	* elf/dl-tunables.list: Add glibc.malloc.mxfast.
> 	* manual/tunables.texi: Document it.
> 	* malloc/malloc.c (do_set_mxfast): New.
> 	(__libc_mallopt): Call it.
> 	* malloc/arena.c: Add mxfast tunable.
> 	* malloc/tst-mxfast.c: New.
> 	* malloc/Makefile: Add it.
>
> diff --git a/elf/dl-tunables.list b/elf/dl-tunables.list
> index b108592b62..b7cc79f8bf 100644
> --- a/elf/dl-tunables.list
> +++ b/elf/dl-tunables.list
> @@ -85,6 +85,11 @@ glibc {
>      tcache_unsorted_limit {
>        type: SIZE_T
>      }
> +    mxfast {
> +      type: SIZE_T
> +      minval: 0
> +      security_level: SXID_IGNORE
> +    }
>    }
>    cpu {
>      hwcap_mask {
> diff --git a/malloc/Makefile b/malloc/Makefile
> index 7d54bad866..c671edd646 100644
> --- a/malloc/Makefile
> +++ b/malloc/Makefile
> @@ -38,6 +38,7 @@ tests := mallocbug tst-malloc tst-valloc tst-calloc tst-obstack \
>  	 tst-malloc_info \
>  	 tst-malloc-too-large \
>  	 tst-malloc-stats-cancellation \
> +	 tst-mxfast \
>  
>  tests-static := \
>  	 tst-interpose-static-nothread \
> @@ -195,6 +196,8 @@ tst-malloc-usable-static-ENV = $(tst-malloc-usable-ENV)
>  tst-malloc-usable-tunables-ENV = GLIBC_TUNABLES=glibc.malloc.check=3
>  tst-malloc-usable-static-tunables-ENV = $(tst-malloc-usable-tunables-ENV)
>  
> +tst-mxfast-ENV = GLIBC_TUNABLES=glibc.malloc.tcache_count=0:glibc.malloc.mxfast=1
> +
>  ifeq ($(experimental-malloc),yes)
>  CPPFLAGS-malloc.c += -DUSE_TCACHE=1
>  else
> diff --git a/malloc/arena.c b/malloc/arena.c
> index 497ae475e7..2cad4344ea 100644
> --- a/malloc/arena.c
> +++ b/malloc/arena.c
> @@ -237,6 +237,7 @@ TUNABLE_CALLBACK_FNDECL (set_tcache_max, size_t)
>  TUNABLE_CALLBACK_FNDECL (set_tcache_count, size_t)
>  TUNABLE_CALLBACK_FNDECL (set_tcache_unsorted_limit, size_t)
>  #endif
> +TUNABLE_CALLBACK_FNDECL (set_mxfast, size_t)
>  #else
>  /* Initialization routine. */
>  #include <string.h>
> @@ -324,6 +325,7 @@ ptmalloc_init (void)
>    TUNABLE_GET (tcache_unsorted_limit, size_t,
>  	       TUNABLE_CALLBACK (set_tcache_unsorted_limit));
>  # endif
> +  TUNABLE_GET (mxfast, size_t, TUNABLE_CALLBACK (set_mxfast));
>  #else
>    const char *s = NULL;
>    if (__glibc_likely (_environ != NULL))
> diff --git a/malloc/malloc.c b/malloc/malloc.c
> index 67cdfd0ad2..f6c2a18f7d 100644
> --- a/malloc/malloc.c
> +++ b/malloc/malloc.c
> @@ -5137,6 +5137,19 @@ do_set_tcache_unsorted_limit (size_t value)
>  }
>  #endif
>  
> +static inline int
> +__always_inline
> +do_set_mxfast (size_t value)
> +{
> +  if (value >= 0 && value <= MAX_FAST_SIZE)
> +    {
> +      LIBC_PROBE (memory_mallopt_mxfast, 2, value, get_max_fast ());
> +      set_max_fast (value);
> +      return 1;
> +    }
> +  return 0;
> +}
> +
>  int
>  __libc_mallopt (int param_number, int value)
>  {
> @@ -5156,13 +5169,7 @@ __libc_mallopt (int param_number, int value)
>    switch (param_number)
>      {
>      case M_MXFAST:
> -      if (value >= 0 && value <= MAX_FAST_SIZE)
> -        {
> -          LIBC_PROBE (memory_mallopt_mxfast, 2, value, get_max_fast ());
> -          set_max_fast (value);
> -        }
> -      else
> -        res = 0;
> +      do_set_mxfast (value);
>        break;
>  
>      case M_TRIM_THRESHOLD:
> diff --git a/malloc/tst-mxfast.c b/malloc/tst-mxfast.c
> new file mode 100644
> index 0000000000..306f748736
> --- /dev/null
> +++ b/malloc/tst-mxfast.c
> @@ -0,0 +1,46 @@
> +/* Test that glibc.malloc.mxfast tunable works.
> +   Copyright (C) 2018 Free Software Foundation, Inc.
> +   This file is part of the GNU C Library.
> +
> +   The GNU C Library is free software; you can redistribute it and/or
> +   modify it under the terms of the GNU Lesser General Public
> +   License as published by the Free Software Foundation; either
> +   version 2.1 of the License, or (at your option) any later version.
> +
> +   The GNU C Library is distributed in the hope that it will be useful,
> +   but WITHOUT ANY WARRANTY; without even the implied warranty of
> +   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
> +   Lesser General Public License for more details.
> +
> +   You should have received a copy of the GNU Lesser General Public
> +   License along with the GNU C Library; if not, see
> +   <http://www.gnu.org/licenses/>.  */
> +
> +#include <malloc.h>
> +#include <assert.h>
> +
> +int
> +do_test(void)
> +{
> +  struct mallinfo m;
> +  char * volatile p1;
> +  char * volatile p2;
> +
> +  /* Arbitrary value; must be in default fastbin range.  */
> +  p1 = malloc (3);
> +  /* Something large so that p1 isn't a "top block" */
> +  p2 = malloc (512);
> +  free (p1);
> +
> +  m = mallinfo();
> +
> +  /* This will fail if there are any blocks in the fastbins.  */
> +  assert (m.smblks == 0);
> +
> +  /* To keep gcc happy.  */
> +  free (p2);
> +
> +  return 0;
> +}
> +
> +#include <support/test-driver.c>
> diff --git a/manual/tunables.texi b/manual/tunables.texi
> index 3345a23969..27593c9469 100644
> --- a/manual/tunables.texi
> +++ b/manual/tunables.texi
> @@ -213,6 +213,18 @@ pre-fill the per-thread cache with.  The default, or when set to zero,
>  is no limit.
>  @end deftp
>  
> +@deftp Tunable glibc.malloc.mxfast
> +One of the optimizations malloc uses is to maintain a series of ''fast
> +bins'' that hold chunks up to a specific size.  The default and
> +maximum size which may be held this way is 80 bytes on 32-bit systems
> +or 160 bytes on 64-bit systems.  Applications which value size over
> +speed may choose to reduce the number of fast bins with this tunable.
> +Note that the value specified includes malloc's internal overhead,
> +which is normally the size of one pointer, so add 4 on 32-bit systems
> +or 8 on 64-bit systems to the size passed to @code{malloc} for the
> +largest bin size to enable.
> +@end deftp
> +
>  @node Elision Tunables
>  @section Elision Tunables
>  @cindex elision tunables


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]