diff options
author | CoprDistGit <infra@openeuler.org> | 2024-08-03 06:28:41 +0000 |
---|---|---|
committer | CoprDistGit <infra@openeuler.org> | 2024-08-03 06:28:41 +0000 |
commit | d20db0561a6a36f914fde030512503b114ef9a0c (patch) | |
tree | d4e5e3494d95c269a1cee6195f11bf3201bcadbf /malloc-hugepage-0006-malloc-Move-MORECORE-fallback-mmap-to-sysmalloc_mmap.patch | |
parent | 016343d99b1b269d7246ef1e143d4b54914433d4 (diff) |
automatic import of glibcopeneuler22.03_LTS_SP4openeuler22.03_LTS_SP3openeuler20.03
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.patch | 119 |
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 + |