elf/ld.so: fix ld.so mmap shared object use hugepage bugfix

(cherry picked from commit a7c72dd6ca9aa03f9c7c5e6cbe1f3e32883d12d5)
This commit is contained in:
Chen Ziyang 2023-03-25 16:16:30 +08:00 committed by openeuler-sync-bot
parent f1ae45d2e5
commit fed2858eec
3 changed files with 95 additions and 1 deletions

View File

@ -0,0 +1,33 @@
From 9145e7cc47b0a43620273ec6f3d1bf016618eb62 Mon Sep 17 00:00:00 2001
From: chenziyang <chenziyang4@huawei.com>
Date: Sat, 4 Mar 2023 17:13:57 +0800
Subject: [PATCH 1/2] elf/ld.so: add MAP_NORESERVE flag for the first mmap 2MB contiguous va
If environment only has 50MB hugepage resources, RX PT_LOAD segment
requires 25MB and RW PT_LOAD segment requires 100MB memory. Before this
patch, we would exit mmap hugepage because we will try to mmap 125MB
hugepage. After this change, ld.so will allow RX PT_LOAD to map into 2MB
hugepage
Signed-off-by: Chen Ziyang<chenziyang4@huawei.com>
---
elf/dl-map-segments-hugepage.h | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/elf/dl-map-segments-hugepage.h b/elf/dl-map-segments-hugepage.h
index 5ea89a36..6ab5f939 100644
--- a/elf/dl-map-segments-hugepage.h
+++ b/elf/dl-map-segments-hugepage.h
@@ -59,7 +59,7 @@ __mmap_reserved_area(const struct loadcmd loadcmds[], size_t nloadcmds,
* This va space can not be munmap in case of multi thread dlopen concurrently
*/
void *map_area_start = __mmap(0, *maparealen, PROT_NONE,
- MAP_PRIVATE|MAP_ANONYMOUS|MAP_HUGETLB|(SHFIT_2MB << MAP_HUGE_SHIFT), -1, 0);
+ MAP_PRIVATE|MAP_ANONYMOUS|MAP_HUGETLB|MAP_NORESERVE|(SHFIT_2MB << MAP_HUGE_SHIFT), -1, 0);
if (__glibc_unlikely (map_area_start == MAP_FAILED))
return MAP_FAILED;
--
2.33.0

View File

@ -0,0 +1,54 @@
From f46625e444f2bbab110e217a34abd0898a242c11 Mon Sep 17 00:00:00 2001
From: chenziyang <chenziyang4@huawei.com>
Date: Sun, 5 Mar 2023 17:04:09 +0800
Subject: [PATCH 2/2] prohibit multiple -i options and do not allow -i specify non
PT_LOAD segment
Signed-off-by: Chen Ziyang<chenziyang4@huawei.com>
---
elf/hugepageedit.c | 13 ++++++++++++-
1 file changed, 12 insertions(+), 1 deletion(-)
diff --git a/elf/hugepageedit.c b/elf/hugepageedit.c
index 0a44ece6..38b4db70 100644
--- a/elf/hugepageedit.c
+++ b/elf/hugepageedit.c
@@ -75,7 +75,7 @@ int main(int argc, char *argv[])
size_t length;
int exit_status = -1;
int i, opt, delete = 0, exec_only = 0, index_set = 0;
- long index = -1;
+ long index = -1, index_count = 0;
while ((opt = getopt(argc, argv, "dxi:")) != -1)
{
switch (opt)
@@ -91,6 +91,11 @@ int main(int argc, char *argv[])
index_set = 1;
if (index < 0)
return -1;
+ index_count++;
+ if (index_count > 1) {
+ fprintf(stderr, "too many -i options in command line\n");
+ return -1;
+ }
break;
default:
print_usage();
@@ -150,6 +155,12 @@ int main(int argc, char *argv[])
continue;
phdr[i].p_flags |= PF_HUGEPAGE;
}
+ } else {
+ if (index_set && index == i) {
+ fprintf(stderr, "Index %ld in -i %s option is not a PT_LOAD segment\n",
+ index, argv[optind]);
+ goto unmap;
+ }
}
}
exit_status = 0;
--
2.33.0

View File

@ -66,7 +66,7 @@
############################################################################## ##############################################################################
Name: glibc Name: glibc
Version: 2.34 Version: 2.34
Release: 113 Release: 114
Summary: The GNU libc libraries Summary: The GNU libc libraries
License: %{all_license} License: %{all_license}
URL: http://www.gnu.org/software/glibc/ URL: http://www.gnu.org/software/glibc/
@ -286,6 +286,8 @@ Patch9032: add-pthread_cond_clockwait-GLIBC_2_28.patch
Patch9033: 0001-ld.so-support-ld.so-mmap-hugetlb-hugepage-according-.patch Patch9033: 0001-ld.so-support-ld.so-mmap-hugetlb-hugepage-according-.patch
Patch9034: 0002-elf-ld.so-keep-compatible-with-the-original-policy-o.patch Patch9034: 0002-elf-ld.so-keep-compatible-with-the-original-policy-o.patch
Patch9035: 0003-elf-ld.so-remove-_mmap_hole-when-ld.so-mmap-PT_LOAD-.patch Patch9035: 0003-elf-ld.so-remove-_mmap_hole-when-ld.so-mmap-PT_LOAD-.patch
Patch9036: elf-ld.so-add-MAP_NORESERVE-flag-for-the-first-mmap-2MB-contig.patch
Patch9037: elf-ld.so-prohibit-multiple-i-options-and-do-not-allow-i-speci.patch
Provides: ldconfig rtld(GNU_HASH) bundled(gnulib) Provides: ldconfig rtld(GNU_HASH) bundled(gnulib)
@ -1451,6 +1453,11 @@ fi
%endif %endif
%changelog %changelog
* Sat Mar 25 2023 Chen Ziyang<chenziyang4@huawei.com> - 2.34-114
- elf/ld.so: fix 2 bugs in ld.so mmap shared object use hugepage
- bugfix: ld.so mmap now first mmap 2MB continuous memory by MAP_NORESERVE flag because we do not want to revert to 4KB when 2MB resources is smaller then entire so. We want to check resources happend in later _mmap_segment_filesz function
- bugfix: fix hugepageedit tool range check logic, prohibit multiple -i options and do not allow -i specify non PT_LOAD segment index
* Tue Mar 14 2023 Qingqing Li <liqingqing3@huawei.com> - 2.34-113 * Tue Mar 14 2023 Qingqing Li <liqingqing3@huawei.com> - 2.34-113
- malloc: Fix transposed arguments in sysmalloc_mmap_fallback call - malloc: Fix transposed arguments in sysmalloc_mmap_fallback call