diff options
Diffstat (limited to 'malloc')
-rw-r--r-- | malloc/Makefile | 3 | ||||
-rw-r--r-- | malloc/arena.c | 2 | ||||
-rw-r--r-- | malloc/malloc.c | 21 | ||||
-rw-r--r-- | malloc/tst-mxfast.c | 50 |
4 files changed, 69 insertions, 7 deletions
diff --git a/malloc/Makefile b/malloc/Makefile index d2fba29..94b74b5 100644 --- a/malloc/Makefile +++ b/malloc/Makefile @@ -39,6 +39,7 @@ tests := mallocbug tst-malloc tst-valloc tst-calloc tst-obstack \ tst-malloc-too-large \ tst-malloc-stats-cancellation \ tst-tcfree1 tst-tcfree2 tst-tcfree3 \ + tst-mxfast \ tests-static := \ tst-interpose-static-nothread \ @@ -196,6 +197,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=0 + ifeq ($(experimental-malloc),yes) CPPFLAGS-malloc.c += -DUSE_TCACHE=1 else diff --git a/malloc/arena.c b/malloc/arena.c index 8309c13..a32eb40 100644 --- a/malloc/arena.c +++ b/malloc/arena.c @@ -236,6 +236,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> @@ -323,6 +324,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 0e65d63..fe97377 100644 --- a/malloc/malloc.c +++ b/malloc/malloc.c @@ -5115,6 +5115,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) { @@ -5134,13 +5147,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 0000000..7a371d2 --- /dev/null +++ b/malloc/tst-mxfast.c @@ -0,0 +1,50 @@ +/* Test that glibc.malloc.mxfast tunable works. + Copyright (C) 2018, 2019 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/>. */ + +/* This test verifies that setting the glibc.malloc.mxfast tunable to + zero results in free'd blocks being returned to the small bins, not + the fast bins. */ + +#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> |