summaryrefslogtreecommitdiff
path: root/malloc-hugepage-0006-malloc-Move-MORECORE-fallback-mmap-to-sysmalloc_mmap.patch
diff options
context:
space:
mode:
authorCoprDistGit <infra@openeuler.org>2024-08-03 06:28:41 +0000
committerCoprDistGit <infra@openeuler.org>2024-08-03 06:28:41 +0000
commitd20db0561a6a36f914fde030512503b114ef9a0c (patch)
treed4e5e3494d95c269a1cee6195f11bf3201bcadbf /malloc-hugepage-0006-malloc-Move-MORECORE-fallback-mmap-to-sysmalloc_mmap.patch
parent016343d99b1b269d7246ef1e143d4b54914433d4 (diff)
Diffstat (limited to 'malloc-hugepage-0006-malloc-Move-MORECORE-fallback-mmap-to-sysmalloc_mmap.patch')
-rw-r--r--malloc-hugepage-0006-malloc-Move-MORECORE-fallback-mmap-to-sysmalloc_mmap.patch119
1 files changed, 119 insertions, 0 deletions
diff --git a/malloc-hugepage-0006-malloc-Move-MORECORE-fallback-mmap-to-sysmalloc_mmap.patch b/malloc-hugepage-0006-malloc-Move-MORECORE-fallback-mmap-to-sysmalloc_mmap.patch
new file mode 100644
index 0000000..afc5650
--- /dev/null
+++ b/malloc-hugepage-0006-malloc-Move-MORECORE-fallback-mmap-to-sysmalloc_mmap.patch
@@ -0,0 +1,119 @@
+From 0849eed45daabf30a02c153695041597d6d43b2d Mon Sep 17 00:00:00 2001
+From: Adhemerval Zanella <adhemerval.zanella@linaro.org>
+Date: Mon, 30 Aug 2021 10:56:55 -0300
+Subject: [PATCH 6/7] malloc: Move MORECORE fallback mmap to
+ sysmalloc_mmap_fallback
+
+So it can be used on hugepage code as well.
+
+Reviewed-by: DJ Delorie <dj@redhat.com>
+---
+ malloc/malloc.c | 85 ++++++++++++++++++++++++++++++-------------------
+ 1 file changed, 53 insertions(+), 32 deletions(-)
+
+diff --git a/malloc/malloc.c b/malloc/malloc.c
+index 1698d45d1e..32050be4cc 100644
+--- a/malloc/malloc.c
++++ b/malloc/malloc.c
+@@ -2498,6 +2498,51 @@ sysmalloc_mmap (INTERNAL_SIZE_T nb, size_t pagesize, int extra_flags, mstate av)
+ return chunk2mem (p);
+ }
+
++/*
++ Allocate memory using mmap() based on S and NB requested size, aligning to
++ PAGESIZE if required. The EXTRA_FLAGS is used on mmap() call. If the call
++ succeedes S is updated with the allocated size. This is used as a fallback
++ if MORECORE fails.
++ */
++static void *
++sysmalloc_mmap_fallback (long int *s, INTERNAL_SIZE_T nb,
++ INTERNAL_SIZE_T old_size, size_t minsize,
++ size_t pagesize, int extra_flags, mstate av)
++{
++ long int size = *s;
++
++ /* Cannot merge with old top, so add its size back in */
++ if (contiguous (av))
++ size = ALIGN_UP (size + old_size, pagesize);
++
++ /* If we are relying on mmap as backup, then use larger units */
++ if ((unsigned long) (size) < minsize)
++ size = minsize;
++
++ /* Don't try if size wraps around 0 */
++ if ((unsigned long) (size) <= (unsigned long) (nb))
++ return MORECORE_FAILURE;
++
++ char *mbrk = (char *) (MMAP (0, size,
++ mtag_mmap_flags | PROT_READ | PROT_WRITE,
++ extra_flags));
++ if (mbrk == MAP_FAILED)
++ return MAP_FAILED;
++
++#ifdef MAP_HUGETLB
++ if (!(extra_flags & MAP_HUGETLB))
++ madvise_thp (mbrk, size);
++#endif
++
++ /* Record that we no longer have a contiguous sbrk region. After the first
++ time mmap is used as backup, we do not ever rely on contiguous space
++ since this could incorrectly bridge regions. */
++ set_noncontiguous (av);
++
++ *s = size;
++ return mbrk;
++}
++
+ static void *
+ sysmalloc (INTERNAL_SIZE_T nb, mstate av)
+ {
+@@ -2696,38 +2741,14 @@ sysmalloc (INTERNAL_SIZE_T nb, mstate av)
+ segregated mmap region.
+ */
+
+- /* Cannot merge with old top, so add its size back in */
+- if (contiguous (av))
+- size = ALIGN_UP (size + old_size, pagesize);
+-
+- /* If we are relying on mmap as backup, then use larger units */
+- if ((unsigned long) (size) < (unsigned long) (MMAP_AS_MORECORE_SIZE))
+- size = MMAP_AS_MORECORE_SIZE;
+-
+- /* Don't try if size wraps around 0 */
+- if ((unsigned long) (size) > (unsigned long) (nb))
+- {
+- char *mbrk = (char *) (MMAP (0, size,
+- mtag_mmap_flags | PROT_READ | PROT_WRITE,
+- 0));
+-
+- if (mbrk != MAP_FAILED)
+- {
+- madvise_thp (mbrk, size);
+-
+- /* We do not need, and cannot use, another sbrk call to find end */
+- brk = mbrk;
+- snd_brk = brk + size;
+-
+- /*
+- Record that we no longer have a contiguous sbrk region.
+- After the first time mmap is used as backup, we do not
+- ever rely on contiguous space since this could incorrectly
+- bridge regions.
+- */
+- set_noncontiguous (av);
+- }
+- }
++ char *mbrk = sysmalloc_mmap_fallback (&size, nb, old_size, pagesize,
++ MMAP_AS_MORECORE_SIZE, 0, av);
++ if (mbrk != MAP_FAILED)
++ {
++ /* We do not need, and cannot use, another sbrk call to find end */
++ brk = mbrk;
++ snd_brk = brk + size;
++ }
+ }
+
+ if (brk != (char *) (MORECORE_FAILURE))
+--
+2.33.0
+