Skip to content

Commit

Permalink
src: refine maps parsing for large pages
Browse files Browse the repository at this point in the history
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 <[email protected]>!

PR-URL: #29973
Reviewed-By: Ben Noordhuis <[email protected]>
Reviewed-By: James M Snell <[email protected]>
Reviewed-By: David Carlier <[email protected]>
  • Loading branch information
Gabriel Schulhof committed Oct 16, 2019
1 parent 9f203f9 commit 1599aeb
Showing 1 changed file with 16 additions and 14 deletions.
30 changes: 16 additions & 14 deletions src/large_pages/node_large_page.cc
Original file line number Diff line number Diff line change
Expand Up @@ -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));
}

Expand All @@ -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;
Expand Down Expand Up @@ -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;
}
}
}
Expand Down

0 comments on commit 1599aeb

Please sign in to comment.