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 <suresh.srinivas@intel.com>!

PR-URL: nodejs#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
Gabriel Schulhof committed Mar 5, 2020
1 parent 2b373bd commit d5b5b22
Showing 1 changed file with 16 additions and 14 deletions.
30 changes: 16 additions & 14 deletions src/large_pages/node_large_page.cc
Expand Up @@ -90,11 +90,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 @@ -110,7 +110,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 @@ -145,18 +145,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 d5b5b22

Please sign in to comment.