[PATCH] realloc: Do not call madvise if oldsize >= THP size
Adhemerval Zanella Netto
adhemerval.zanella@linaro.org
Tue Oct 7 17:46:18 GMT 2025
On 06/10/25 02:53, Dev Jain wrote:
> Linux handles virtual memory in Virtual Memory Areas (VMAs). The
> madvise(MADV_HUGEPAGE) call works on a VMA granularity, which sets the
> VM_HUGEPAGE flag on the VMA. If this VMA or a portion of it is mremapped
> to a different location, Linux will create a new VMA, which will have
> the same flags as the old one. This implies that the VM_HUGEPAGE flag
> will be retained. Therefore, if we can guarantee that the old VMA was
> marked with VM_HUGEPAGE, then there is no need to call madvise_thp() in
> mremap_chunk().
>
> The old chunk comes from an mmap allocation, which has already been
> enlightened for THP. This implies that, if THP is on, and the size of the
> old chunk is greater than or equal to thp_pagesize, the representative VMA
> of this chunk has the VM_HUGEPAGE flag set. Hence in this case we can
> avoid invoking the madvise() syscall.
LGTM, thanks.
Reviewed-by: Adhemerval Zanella <adhemerval.zanella@linaro.org>
> ---
> malloc/malloc.c | 5 ++++-
> 1 file changed, 4 insertions(+), 1 deletion(-)
>
> diff --git a/malloc/malloc.c b/malloc/malloc.c
> index f46cfd5eac..7b666d5b2a 100644
> --- a/malloc/malloc.c
> +++ b/malloc/malloc.c
> @@ -3065,7 +3065,10 @@ mremap_chunk (mchunkptr p, size_t new_size)
> if (cp == MAP_FAILED)
> return NULL;
>
> - madvise_thp (cp, new_size);
> + /* mremap preserves the region's flags - this means that if the old chunk
> + was marked with MADV_HUGEPAGE, the new chunk will retain that. */
Double space after period.
> + if (total_size < mp_.thp_pagesize)
> + madvise_thp (cp, new_size);
>
> p = (mchunkptr) (cp + offset);
>
More information about the Libc-alpha
mailing list