Skip to content
Permalink
Browse files

src: refine maps parsing for large pages

Multiple sections may be marked as "r-xp" and with the executable's
path. We use the location of the `__nodetext` symbol added by the linker
script to ensure that the range we retrieve from the maps file does
indeed contain the Node.js text section.

Thanks to Suresh Srinivas <suresh.srinivas@intel.com>!

PR-URL: #29973
Reviewed-By: Ben Noordhuis <info@bnoordhuis.nl>
Reviewed-By: James M Snell <jasnell@gmail.com>
Reviewed-By: David Carlier <devnexen@gmail.com>
  • Loading branch information
gabrielschulhof authored and targos committed Oct 9, 2019
1 parent 3e39909 commit 45c5ad79223c2b6fedab436b8973f6d7c93fa287
Showing with 16 additions and 14 deletions.
  1. +16 −14 src/large_pages/node_large_page.cc
@@ -83,11 +83,11 @@ static void PrintSystemError(int error) {
return;
}

inline int64_t hugepage_align_up(int64_t addr) {
inline uintptr_t hugepage_align_up(uintptr_t addr) {
return (((addr) + (hps) - 1) & ~((hps) - 1));
}

inline int64_t hugepage_align_down(int64_t addr) {
inline uintptr_t hugepage_align_down(uintptr_t addr) {
return ((addr) & ~((hps) - 1));
}

@@ -103,7 +103,7 @@ static struct text_region FindNodeTextRegion() {
std::string permission;
std::string dev;
char dash;
int64_t start, end, offset, inode;
uintptr_t start, end, offset, inode;
struct text_region nregion;

nregion.found_text_region = false;
@@ -138,18 +138,20 @@ static struct text_region FindNodeTextRegion() {
std::string pathname;
iss >> pathname;
if (pathname == exename && permission == "r-xp") {
start = reinterpret_cast<uint64_t>(&__nodetext);
char* from = reinterpret_cast<char*>(hugepage_align_up(start));
char* to = reinterpret_cast<char*>(hugepage_align_down(end));

if (from < to) {
size_t size = to - from;
nregion.found_text_region = true;
nregion.from = from;
nregion.to = to;
nregion.total_hugepages = size / hps;
uintptr_t ntext = reinterpret_cast<uintptr_t>(&__nodetext);
if (ntext >= start && ntext < end) {
char* from = reinterpret_cast<char*>(hugepage_align_up(ntext));
char* to = reinterpret_cast<char*>(hugepage_align_down(end));

if (from < to) {
size_t size = to - from;
nregion.found_text_region = true;
nregion.from = from;
nregion.to = to;
nregion.total_hugepages = size / hps;
}
break;
}
break;
}
}
}

0 comments on commit 45c5ad7

Please sign in to comment.
You can’t perform that action at this time.