aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorWilco Dijkstra <wilco.dijkstra@arm.com>2025-03-20 16:23:07 +0000
committerWilco Dijkstra <wilco.dijkstra@arm.com>2025-03-25 18:53:01 +0000
commitcd335350021fd0b7ac533c83717ee38832fd9887 (patch)
treeaee7566b193f7191fc322b12950248b8c1a598b7
parent8bac7f7a434e158e9765b3b4d1ecaf10304f5994 (diff)
downloadglibc-master.zip
glibc-master.tar.gz
glibc-master.tar.bz2
malloc: Use _int_free_chunk for remaindersHEADmaster
When splitting a chunk, release the tail part by calling int_free_chunk. This avoids inserting random blocks into tcache that were never requested by the user. Fragmentation will be worse if they are never used again. Note if the tail is fairly small, we could avoid splitting it at all. Also remove an oddly placed initialization of tcache in _libc_realloc. Reviewed-by: DJ Delorie <dj@redhat.com>
-rw-r--r--malloc/malloc.c15
1 files changed, 6 insertions, 9 deletions
diff --git a/malloc/malloc.c b/malloc/malloc.c
index b73ddbf..0811061 100644
--- a/malloc/malloc.c
+++ b/malloc/malloc.c
@@ -2646,7 +2646,7 @@ sysmalloc (INTERNAL_SIZE_T nb, mstate av)
CHUNK_HDR_SZ | PREV_INUSE);
set_foot (chunk_at_offset (old_top, old_size), CHUNK_HDR_SZ);
set_head (old_top, old_size | PREV_INUSE | NON_MAIN_ARENA);
- _int_free (av, old_top, 1);
+ _int_free_chunk (av, old_top, chunksize (old_top), 1);
}
else
{
@@ -2912,7 +2912,7 @@ sysmalloc (INTERNAL_SIZE_T nb, mstate av)
/* If possible, release the rest. */
if (old_size >= MINSIZE)
{
- _int_free (av, old_top, 1);
+ _int_free_chunk (av, old_top, chunksize (old_top), 1);
}
}
}
@@ -3530,10 +3530,7 @@ __libc_realloc (void *oldmem, size_t bytes)
if (chunk_is_mmapped (oldp))
ar_ptr = NULL;
else
- {
- MAYBE_INIT_TCACHE ();
- ar_ptr = arena_for_chunk (oldp);
- }
+ ar_ptr = arena_for_chunk (oldp);
/* Little security check which won't hurt performance: the allocator
never wraps around at the end of the address space. Therefore
@@ -3608,7 +3605,7 @@ __libc_realloc (void *oldmem, size_t bytes)
size_t sz = memsize (oldp);
memcpy (newp, oldmem, sz);
(void) tag_region (chunk2mem (oldp), sz);
- _int_free (ar_ptr, oldp, 0);
+ _int_free_chunk (ar_ptr, oldp, chunksize (oldp), 0);
}
}
@@ -5059,7 +5056,7 @@ _int_realloc (mstate av, mchunkptr oldp, INTERNAL_SIZE_T oldsize,
(void) tag_region (oldmem, sz);
newmem = tag_new_usable (newmem);
memcpy (newmem, oldmem, sz);
- _int_free (av, oldp, 1);
+ _int_free_chunk (av, oldp, chunksize (oldp), 1);
check_inuse_chunk (av, newp);
return newmem;
}
@@ -5087,7 +5084,7 @@ _int_realloc (mstate av, mchunkptr oldp, INTERNAL_SIZE_T oldsize,
(av != &main_arena ? NON_MAIN_ARENA : 0));
/* Mark remainder as inuse so free() won't complain */
set_inuse_bit_at_offset (remainder, remainder_size);
- _int_free (av, remainder, 1);
+ _int_free_chunk (av, remainder, chunksize (remainder), 1);
}
check_inuse_chunk (av, newp);