mirror of
https://sourceware.org/git/glibc.git
synced 2024-11-24 22:10:13 +00:00
Created tunable to force small pages on stack allocation.
Created tunable glibc.pthread.stack_hugetlb to control when hugepages can be used for stack allocation. In case THP are enabled and glibc.pthread.stack_hugetlb is set to 0, glibc will madvise the kernel not to use allow hugepages for stack allocations. Reviewed-by: Adhemerval Zanella <adhemerval.zanella@linaro.org>
This commit is contained in:
parent
0f61cd4b9c
commit
b630be0922
3
NEWS
3
NEWS
@ -21,6 +21,9 @@ Major new features:
|
|||||||
|
|
||||||
* PRIb* and PRIB* macros from C2X have been added to <inttypes.h>.
|
* PRIb* and PRIB* macros from C2X have been added to <inttypes.h>.
|
||||||
|
|
||||||
|
* A new tunable, glibc.pthread.stack_hugetlb, can be used to disable
|
||||||
|
Transparent Huge Pages (THP) in stack allocation at pthread_create.
|
||||||
|
|
||||||
Deprecated and removed features, and other changes affecting compatibility:
|
Deprecated and removed features, and other changes affecting compatibility:
|
||||||
|
|
||||||
* In the Linux kernel for the hppa/parisc architecture some of the
|
* In the Linux kernel for the hppa/parisc architecture some of the
|
||||||
|
@ -459,6 +459,21 @@ registration on behalf of the application.
|
|||||||
Restartable sequences are a Linux-specific extension.
|
Restartable sequences are a Linux-specific extension.
|
||||||
@end deftp
|
@end deftp
|
||||||
|
|
||||||
|
@deftp Tunable glibc.pthread.stack_hugetlb
|
||||||
|
This tunable controls whether to use Huge Pages in the stacks created by
|
||||||
|
@code{pthread_create}. This tunable only affects the stacks created by
|
||||||
|
@theglibc{}, it has no effect on stack assigned with
|
||||||
|
@code{pthread_attr_setstack}.
|
||||||
|
|
||||||
|
The default is @samp{1} where the system default value is used. Setting
|
||||||
|
its value to @code{0} enables the use of @code{madvise} with
|
||||||
|
@code{MADV_NOHUGEPAGE} after stack creation with @code{mmap}.
|
||||||
|
|
||||||
|
This is a memory utilization optimization, since internal glibc setup of either
|
||||||
|
the thread descriptor and the guard page might force the kernel to move the
|
||||||
|
thread stack originally backup by Huge Pages to default pages.
|
||||||
|
@end deftp
|
||||||
|
|
||||||
@node Hardware Capability Tunables
|
@node Hardware Capability Tunables
|
||||||
@section Hardware Capability Tunables
|
@section Hardware Capability Tunables
|
||||||
@cindex hardware capability tunables
|
@cindex hardware capability tunables
|
||||||
|
@ -369,6 +369,12 @@ allocate_stack (const struct pthread_attr *attr, struct pthread **pdp,
|
|||||||
if (__glibc_unlikely (mem == MAP_FAILED))
|
if (__glibc_unlikely (mem == MAP_FAILED))
|
||||||
return errno;
|
return errno;
|
||||||
|
|
||||||
|
/* Do madvise in case the tunable glibc.pthread.stack_hugetlb is
|
||||||
|
set to 0, disabling hugetlb. */
|
||||||
|
if (__glibc_unlikely (__nptl_stack_hugetlb == 0)
|
||||||
|
&& __madvise (mem, size, MADV_NOHUGEPAGE) != 0)
|
||||||
|
return errno;
|
||||||
|
|
||||||
/* SIZE is guaranteed to be greater than zero.
|
/* SIZE is guaranteed to be greater than zero.
|
||||||
So we can never get a null pointer back from mmap. */
|
So we can never get a null pointer back from mmap. */
|
||||||
assert (mem != NULL);
|
assert (mem != NULL);
|
||||||
|
@ -21,6 +21,7 @@
|
|||||||
#include <pthreadP.h>
|
#include <pthreadP.h>
|
||||||
|
|
||||||
size_t __nptl_stack_cache_maxsize = 40 * 1024 * 1024;
|
size_t __nptl_stack_cache_maxsize = 40 * 1024 * 1024;
|
||||||
|
int32_t __nptl_stack_hugetlb = 1;
|
||||||
|
|
||||||
void
|
void
|
||||||
__nptl_stack_list_del (list_t *elem)
|
__nptl_stack_list_del (list_t *elem)
|
||||||
|
@ -27,6 +27,9 @@
|
|||||||
/* Maximum size of the cache, in bytes. 40 MiB by default. */
|
/* Maximum size of the cache, in bytes. 40 MiB by default. */
|
||||||
extern size_t __nptl_stack_cache_maxsize attribute_hidden;
|
extern size_t __nptl_stack_cache_maxsize attribute_hidden;
|
||||||
|
|
||||||
|
/* Should allow stacks to use hugetlb. (1) is default. */
|
||||||
|
extern int32_t __nptl_stack_hugetlb;
|
||||||
|
|
||||||
/* Check whether the stack is still used or not. */
|
/* Check whether the stack is still used or not. */
|
||||||
static inline bool
|
static inline bool
|
||||||
__nptl_stack_in_use (struct pthread *pd)
|
__nptl_stack_in_use (struct pthread *pd)
|
||||||
|
@ -44,6 +44,12 @@ TUNABLE_CALLBACK (set_stack_cache_size) (tunable_val_t *valp)
|
|||||||
__nptl_stack_cache_maxsize = valp->numval;
|
__nptl_stack_cache_maxsize = valp->numval;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
TUNABLE_CALLBACK (set_stack_hugetlb) (tunable_val_t *valp)
|
||||||
|
{
|
||||||
|
__nptl_stack_hugetlb = (int32_t) valp->numval;
|
||||||
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
__pthread_tunables_init (void)
|
__pthread_tunables_init (void)
|
||||||
{
|
{
|
||||||
@ -51,4 +57,6 @@ __pthread_tunables_init (void)
|
|||||||
TUNABLE_CALLBACK (set_mutex_spin_count));
|
TUNABLE_CALLBACK (set_mutex_spin_count));
|
||||||
TUNABLE_GET (stack_cache_size, size_t,
|
TUNABLE_GET (stack_cache_size, size_t,
|
||||||
TUNABLE_CALLBACK (set_stack_cache_size));
|
TUNABLE_CALLBACK (set_stack_cache_size));
|
||||||
|
TUNABLE_GET (stack_hugetlb, int32_t,
|
||||||
|
TUNABLE_CALLBACK (set_stack_hugetlb));
|
||||||
}
|
}
|
||||||
|
@ -33,5 +33,11 @@ glibc {
|
|||||||
maxval: 1
|
maxval: 1
|
||||||
default: 1
|
default: 1
|
||||||
}
|
}
|
||||||
|
stack_hugetlb {
|
||||||
|
type: INT_32
|
||||||
|
minval: 0
|
||||||
|
maxval: 1
|
||||||
|
default: 1
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user