mirror of
https://sourceware.org/git/glibc.git
synced 2025-07-28 00:21:52 +03:00
Add probes for malloc retries.
for ChangeLog * malloc/malloc.c (__libc_malloc): Add memory_malloc_retry probe. (__libc_realloc): Add memory_realloc_retry probe. (__libc_memalign): Add memory_memalign_retry probe. (__libc_valloc): Add memory_valloc_retry probe. (__libc_pvalloc): Add memory_pvalloc_retry probe. (__libc_calloc): Add memory_calloc_retry probe. * manual/probes.texi: Document them.
This commit is contained in:
@ -1,5 +1,13 @@
|
|||||||
2013-09-20 Alexandre Oliva <aoliva@redhat.com>
|
2013-09-20 Alexandre Oliva <aoliva@redhat.com>
|
||||||
|
|
||||||
|
* malloc/malloc.c (__libc_malloc): Add memory_malloc_retry probe.
|
||||||
|
(__libc_realloc): Add memory_realloc_retry probe.
|
||||||
|
(__libc_memalign): Add memory_memalign_retry probe.
|
||||||
|
(__libc_valloc): Add memory_valloc_retry probe.
|
||||||
|
(__libc_pvalloc): Add memory_pvalloc_retry probe.
|
||||||
|
(__libc_calloc): Add memory_calloc_retry probe.
|
||||||
|
* manual/probes.texi: Document them.
|
||||||
|
|
||||||
* malloc/arena.c (get_free_list): Add probe
|
* malloc/arena.c (get_free_list): Add probe
|
||||||
memory_arena_reuse_free_list.
|
memory_arena_reuse_free_list.
|
||||||
(reused_arena) [PER_THREAD]: Add probes memory_arena_reuse_wait
|
(reused_arena) [PER_THREAD]: Add probes memory_arena_reuse_wait
|
||||||
|
@ -2856,6 +2856,7 @@ __libc_malloc(size_t bytes)
|
|||||||
return 0;
|
return 0;
|
||||||
victim = _int_malloc(ar_ptr, bytes);
|
victim = _int_malloc(ar_ptr, bytes);
|
||||||
if(!victim) {
|
if(!victim) {
|
||||||
|
LIBC_PROBE (memory_malloc_retry, 1, bytes);
|
||||||
ar_ptr = arena_get_retry(ar_ptr, bytes);
|
ar_ptr = arena_get_retry(ar_ptr, bytes);
|
||||||
if (__builtin_expect(ar_ptr != NULL, 1)) {
|
if (__builtin_expect(ar_ptr != NULL, 1)) {
|
||||||
victim = _int_malloc(ar_ptr, bytes);
|
victim = _int_malloc(ar_ptr, bytes);
|
||||||
@ -2991,6 +2992,7 @@ __libc_realloc(void* oldmem, size_t bytes)
|
|||||||
if (newp == NULL)
|
if (newp == NULL)
|
||||||
{
|
{
|
||||||
/* Try harder to allocate memory in other arenas. */
|
/* Try harder to allocate memory in other arenas. */
|
||||||
|
LIBC_PROBE (memory_realloc_retry, 2, bytes, oldmem);
|
||||||
newp = __libc_malloc(bytes);
|
newp = __libc_malloc(bytes);
|
||||||
if (newp != NULL)
|
if (newp != NULL)
|
||||||
{
|
{
|
||||||
@ -3032,6 +3034,7 @@ __libc_memalign(size_t alignment, size_t bytes)
|
|||||||
return 0;
|
return 0;
|
||||||
p = _int_memalign(ar_ptr, alignment, bytes);
|
p = _int_memalign(ar_ptr, alignment, bytes);
|
||||||
if(!p) {
|
if(!p) {
|
||||||
|
LIBC_PROBE (memory_memalign_retry, 2, bytes, alignment);
|
||||||
ar_ptr = arena_get_retry (ar_ptr, bytes);
|
ar_ptr = arena_get_retry (ar_ptr, bytes);
|
||||||
if (__builtin_expect(ar_ptr != NULL, 1)) {
|
if (__builtin_expect(ar_ptr != NULL, 1)) {
|
||||||
p = _int_memalign(ar_ptr, alignment, bytes);
|
p = _int_memalign(ar_ptr, alignment, bytes);
|
||||||
@ -3075,6 +3078,7 @@ __libc_valloc(size_t bytes)
|
|||||||
return 0;
|
return 0;
|
||||||
p = _int_valloc(ar_ptr, bytes);
|
p = _int_valloc(ar_ptr, bytes);
|
||||||
if(!p) {
|
if(!p) {
|
||||||
|
LIBC_PROBE (memory_valloc_retry, 1, bytes);
|
||||||
ar_ptr = arena_get_retry (ar_ptr, bytes);
|
ar_ptr = arena_get_retry (ar_ptr, bytes);
|
||||||
if (__builtin_expect(ar_ptr != NULL, 1)) {
|
if (__builtin_expect(ar_ptr != NULL, 1)) {
|
||||||
p = _int_memalign(ar_ptr, pagesz, bytes);
|
p = _int_memalign(ar_ptr, pagesz, bytes);
|
||||||
@ -3116,6 +3120,7 @@ __libc_pvalloc(size_t bytes)
|
|||||||
arena_get(ar_ptr, bytes + 2*pagesz + MINSIZE);
|
arena_get(ar_ptr, bytes + 2*pagesz + MINSIZE);
|
||||||
p = _int_pvalloc(ar_ptr, bytes);
|
p = _int_pvalloc(ar_ptr, bytes);
|
||||||
if(!p) {
|
if(!p) {
|
||||||
|
LIBC_PROBE (memory_pvalloc_retry, 1, bytes);
|
||||||
ar_ptr = arena_get_retry (ar_ptr, bytes + 2*pagesz + MINSIZE);
|
ar_ptr = arena_get_retry (ar_ptr, bytes + 2*pagesz + MINSIZE);
|
||||||
if (__builtin_expect(ar_ptr != NULL, 1)) {
|
if (__builtin_expect(ar_ptr != NULL, 1)) {
|
||||||
p = _int_memalign(ar_ptr, pagesz, rounded_bytes);
|
p = _int_memalign(ar_ptr, pagesz, rounded_bytes);
|
||||||
@ -3192,6 +3197,7 @@ __libc_calloc(size_t n, size_t elem_size)
|
|||||||
av == arena_for_chunk(mem2chunk(mem)));
|
av == arena_for_chunk(mem2chunk(mem)));
|
||||||
|
|
||||||
if (mem == 0) {
|
if (mem == 0) {
|
||||||
|
LIBC_PROBE (memory_calloc_retry, 1, sz);
|
||||||
av = arena_get_retry (av, sz);
|
av = arena_get_retry (av, sz);
|
||||||
if (__builtin_expect(av != NULL, 1)) {
|
if (__builtin_expect(av != NULL, 1)) {
|
||||||
mem = _int_malloc(av, sz);
|
mem = _int_malloc(av, sz);
|
||||||
|
@ -26,6 +26,28 @@ the virtual memory subsystem of @theglibc{}. The location and the
|
|||||||
availability of some probes depend on whether per-thread arenas are
|
availability of some probes depend on whether per-thread arenas are
|
||||||
enabled (the default) or disabled at the time @theglibc{} is compiled.
|
enabled (the default) or disabled at the time @theglibc{} is compiled.
|
||||||
|
|
||||||
|
@deftp Probe memory_malloc_retry (size_t @var{$arg1})
|
||||||
|
@deftpx Probe memory_realloc_retry (size_t @var{$arg1}, void *@var{$arg2})
|
||||||
|
@deftpx Probe memory_memalign_retry (size_t @var{$arg1}, size_t @var{$arg2})
|
||||||
|
@deftpx Probe memory_valloc_retry (size_t @var{$arg1})
|
||||||
|
@deftpx Probe memory_pvalloc_retry (size_t @var{$arg1})
|
||||||
|
@deftpx Probe memory_calloc_retry (size_t @var{$arg1})
|
||||||
|
These probes are triggered when the corresponding functions fail to
|
||||||
|
obtain the requested amount of memory from the arena in use, before they
|
||||||
|
call @code{arena_get_retry} to select an alternate arena in which to
|
||||||
|
retry the allocation. Argument @var{$arg1} is the amount of memory
|
||||||
|
requested by the user; in the @code{calloc} case, that is the total size
|
||||||
|
computed from both function arguments. In the @code{realloc} case,
|
||||||
|
@var{$arg2} is the pointer to the memory area being resized. In the
|
||||||
|
@code{memalign} case, @var{$arg2} is the alignment to be used for the
|
||||||
|
request, which may be stricter than the value passed to the
|
||||||
|
@code{memalign} function.
|
||||||
|
|
||||||
|
Note that the argument order does @emph{not} match that of the
|
||||||
|
corresponding two-argument functions, so that in all of these probes the
|
||||||
|
user-requested allocation size is in @var{$arg1}.
|
||||||
|
@end deftp
|
||||||
|
|
||||||
@deftp Probe memory_arena_new (void *@var{$arg1}, size_t @var{$arg2})
|
@deftp Probe memory_arena_new (void *@var{$arg1}, size_t @var{$arg2})
|
||||||
This probe is triggered when @code{malloc} allocates and initializes an
|
This probe is triggered when @code{malloc} allocates and initializes an
|
||||||
additional arena (not the main arena), but before the arena is assigned
|
additional arena (not the main arena), but before the arena is assigned
|
||||||
|
Reference in New Issue
Block a user