glibc/elf-add-some-debug-info-for-dynamic-library-hugepage.patch
shixuantong 5e5f573b1a enable share library use huge page for aarch architecture
(cherry picked from commit 2291cb16841ea15ab298859a3175b6b65f65ea48)
2024-08-21 09:05:52 +08:00

125 lines
5.8 KiB
Diff

From 50c5e23ead7f0be215b8133dfa7ab6a93e60ebf7 Mon Sep 17 00:00:00 2001
From: Lv Ying <lvying6@huawei.com>
Date: Tue, 4 Jun 2024 01:23:09 -0400
Subject: [PATCH 2/2] elf: add some debug info for dynamic library hugepage
feature
add some debug info for dynamic library hugepage feature, use
page-aligined address space in debug info which is actual mapped
Signed-off-by: Lv Ying <lvying6@huawei.com>
---
elf/dl-map-segments-hugepage.h | 37 ++++++++++++++++++++--------------
1 file changed, 22 insertions(+), 15 deletions(-)
diff --git a/elf/dl-map-segments-hugepage.h b/elf/dl-map-segments-hugepage.h
index 3ea52dbd..7410072c 100644
--- a/elf/dl-map-segments-hugepage.h
+++ b/elf/dl-map-segments-hugepage.h
@@ -212,7 +212,7 @@ _mmap_remain_zero_page(ElfW(Addr) zeropage, ElfW(Addr) zeroend, int prot)
}
if (__glibc_unlikely (GLRO(dl_debug_mask) & DL_DEBUG_FILES))
- _dl_debug_printf("\t\t\t=> mmap anonymous hugepage: [%lx-%lx)\n", hp_start, hp_start + len - mod);
+ _dl_debug_printf("\t\t\t=> %s mmap anonymous hugepage: [%lx-%lx)\n", __func__, hp_start, hp_start + len - mod);
mapat = __mmap((caddr_t) hp_start, len - mod, prot,
MAP_FIXED|MAP_PRIVATE|MAP_ANONYMOUS|MAP_HUGETLB|(SHFIT_2MB << MAP_HUGE_SHIFT),
-1, 0);
@@ -221,6 +221,9 @@ _mmap_remain_zero_page(ElfW(Addr) zeropage, ElfW(Addr) zeroend, int prot)
if (mod > 0)
{
+ if (__glibc_unlikely (GLRO(dl_debug_mask) & DL_DEBUG_FILES))
+ _dl_debug_printf("\t\t\t=> %s mmap anonymous tail normal page: [%lx-%lx)\n", __func__,
+ hp_start + len - mod, hp_start + len - mod + ALIGN_UP(mod, GLRO(dl_pagesize)));
mapat =__mmap((caddr_t)(hp_start + len - mod), mod, prot,
MAP_ANON|MAP_PRIVATE|MAP_FIXED, -1, 0);
if (__glibc_unlikely (mapat == MAP_FAILED))
@@ -301,7 +304,7 @@ _mmap_segment_memsz(struct link_map *l, const struct loadcmd * c,
{
*memsz_len = ALIGN_UP(zeroend, GLRO(dl_pagesize)) - zeropage;
if (__glibc_unlikely (GLRO(dl_debug_mask) & DL_DEBUG_FILES))
- _dl_debug_printf("\t\tzero remain page [%lx-%lx)\n", zeropage, zeroend);
+ _dl_debug_printf("\t\tmmap remain anonymous page [%lx-%lx)\n", zeropage, ALIGN_UP(zeroend, GLRO(dl_pagesize)));
errstring = _mmap_remain_zero_page(zeropage, zeroend, c->prot);
}
return errstring;
@@ -475,8 +478,8 @@ __mmap_segment_normalsz(const struct loadcmd *c, ElfW(Addr) mapstart, int fd,
size_t *mapseglen)
{
if (__glibc_unlikely (GLRO(dl_debug_mask) & DL_DEBUG_FILES))
- _dl_debug_printf("\tuse normal page mmap segment:[%lx-%lx)\n", mapstart,
- mapstart + (c->allocend - c->mapstart));
+ _dl_debug_printf("\t\t%s mmap current segment in normal page:[%lx-%lx)\n", __func__, mapstart,
+ mapstart + (ALIGN_UP(c->allocend, GLRO(dl_pagesize)) - c->mapstart));
if (c->mapend > c->mapstart &&
(__mmap((void *)mapstart, c->mapend - c->mapstart, c->prot,
@@ -515,7 +518,7 @@ __mmap_segment_normalsz(const struct loadcmd *c, ElfW(Addr) mapstart, int fd,
}
}
- *mapseglen = c->allocend - c->mapstart;
+ *mapseglen = ALIGN_UP(c->allocend, GLRO(dl_pagesize)) - c->mapstart;
return NULL;
}
@@ -534,15 +537,18 @@ _mmap_segment(struct link_map *l, const struct loadcmd loadcmds[], size_t nloadc
const char * errstring = NULL;
size_t extra_len, memsz_len = 0;
- if (!hp_bitmap[((void *)c - (void *)loadcmds) / sizeof(struct loadcmd)]) {
- return __mmap_segment_normalsz(c, mapstart, fd, mapseglen);
- }
-
- extra_len = _extra_mmap(l, loadcmds, nloadcmds, c, mapstart);
if (__glibc_unlikely (GLRO(dl_debug_mask) & DL_DEBUG_FILES))
- _dl_debug_printf("\t%s(0x%lx): extra_len = 0x%lx\n\t{\n", __func__,
- (unsigned long)c, extra_len);
+ _dl_debug_printf("\t%s mmap from %lx: \n\t{\n", __func__, mapstart);
+ if (!hp_bitmap[((void *)c - (void *)loadcmds) / sizeof(struct loadcmd)])
+ {
+ errstring = __mmap_segment_normalsz(c, mapstart, fd, mapseglen);
+ if (__glibc_unlikely (GLRO(dl_debug_mask) & DL_DEBUG_FILES))
+ _dl_debug_printf("\t} => mapseglen = 0x%lx\n", *mapseglen);
+ return errstring;
+ }
+
+ extra_len = _extra_mmap(l, loadcmds, nloadcmds, c, mapstart);
errstring = _mmap_segment_filesz(l, c, mapstart, extra_len, fd);
if (__glibc_unlikely (errstring != NULL))
return errstring;
@@ -552,7 +558,8 @@ _mmap_segment(struct link_map *l, const struct loadcmd loadcmds[], size_t nloadc
*mapseglen = c->mapend - c->mapstart + extra_len + memsz_len;
if (__glibc_unlikely (GLRO(dl_debug_mask) & DL_DEBUG_FILES))
- _dl_debug_printf("\t} => mapseglen = 0x%lx, memsz_len = 0x%lx\n", *mapseglen, memsz_len);
+ _dl_debug_printf("\t} => mapseglen = 0x%lx, extra_len = 0x%lx, memsz_len = 0x%lx\n",
+ *mapseglen, extra_len, memsz_len);
return NULL;
}
@@ -652,7 +659,7 @@ _dl_map_segments_largein (struct link_map *l, int fd,
if (l->l_map_start > (ElfW(Addr))map_area_start)
{
if (__glibc_unlikely (GLRO(dl_debug_mask) & DL_DEBUG_FILES))
- _dl_debug_printf("__munmap [%lx-%lx)\n", (ElfW(Addr))map_area_start, l->l_map_start);
+ _dl_debug_printf("__munmap head reserved area [%lx-%lx)\n", (ElfW(Addr))map_area_start, l->l_map_start);
__munmap(map_area_start, l->l_map_start - (ElfW(Addr))map_area_start);
}
@@ -663,7 +670,7 @@ _dl_map_segments_largein (struct link_map *l, int fd,
if ((ElfW(Addr))map_area_start + maparealen > l_map_end)
{
if (__glibc_unlikely (GLRO(dl_debug_mask) & DL_DEBUG_FILES))
- _dl_debug_printf("__munmap [%lx-%lx)\n", l_map_end, (ElfW(Addr))map_area_start + maparealen);
+ _dl_debug_printf("__munmap tail reserved area [%lx-%lx)\n", l_map_end, (ElfW(Addr))map_area_start + maparealen);
__munmap((void *)l_map_end, (ElfW(Addr))map_area_start + maparealen - l_map_end);
}
--
2.40.0