diff options
author | Gabriel Schulhof <gabriel.schulhof@intel.com> | 2019-12-13 22:59:37 +0300 |
---|---|---|
committer | Ruben Bridgewater <ruben@bridgewater.de> | 2020-01-03 18:12:10 +0300 |
commit | 49a7e73898d5a90e861f1ed96cc91f7dd3e750d5 (patch) | |
tree | a9b6297ebd00a544c2ea36eb42b12d1c299daa7a /src/large_pages | |
parent | a83d33810258772fde859d485698229dafaea6ed (diff) |
src: make --use-largepages a runtime option
Moves the option that instructs Node.js to-remap its static code to
large pages from a configure-time option to a runtime option. This
should make it easy to assess the performance impact of such a change
without having to custom-build.
PR-URL: https://github.com/nodejs/node/pull/30954
Reviewed-By: Ben Noordhuis <info@bnoordhuis.nl>
Reviewed-By: David Carlier <devnexen@gmail.com>
Reviewed-By: David Carlier <devnexen@gmail.com>
Reviewed-By: Anna Henningsen <anna@addaleax.net>
Reviewed-By: Colin Ihrig <cjihrig@gmail.com>
Reviewed-By: Gireesh Punathil <gpunathi@in.ibm.com>
Reviewed-By: Denys Otrishko <shishugi@gmail.com>
Co-authored-by: David Carlier <devnexen@gmail.com>
Diffstat (limited to 'src/large_pages')
-rw-r--r-- | src/large_pages/node_large_page.cc | 19 |
1 files changed, 11 insertions, 8 deletions
diff --git a/src/large_pages/node_large_page.cc b/src/large_pages/node_large_page.cc index 68fa178b40b..3897b819e81 100644 --- a/src/large_pages/node_large_page.cc +++ b/src/large_pages/node_large_page.cc @@ -62,7 +62,7 @@ // Map a new area and copy the original code there // Use mmap using the start address with MAP_FIXED so we get exactly the // same virtual address -// Use madvise with MADV_HUGE_PAGE to use Anonymous 2M Pages +// Use madvise with MADV_HUGEPAGE to use Anonymous 2M Pages // If successful copy the code there and unmap the original region. extern char __nodetext; @@ -308,7 +308,7 @@ static bool IsSuperPagesEnabled() { // a. map a new area and copy the original code there // b. mmap using the start address with MAP_FIXED so we get exactly // the same virtual address (except on macOS). -// c. madvise with MADV_HUGE_PAGE +// c. madvise with MADV_HUGEPAGE // d. If successful copy the code there and unmap the original region int #if !defined(__APPLE__) @@ -333,9 +333,6 @@ MoveTextRegionToLargePages(const text_region& r) { PrintSystemError(errno); return -1; } - auto munmap_on_return = OnScopeLeave([nmem, size]() { - if (-1 == munmap(nmem, size)) PrintSystemError(errno); - }); memcpy(nmem, r.from, size); @@ -352,13 +349,14 @@ MoveTextRegionToLargePages(const text_region& r) { return -1; } - ret = madvise(tmem, size, MADV_HUGEPAGE); + ret = madvise(tmem, size, 14 /* MADV_HUGEPAGE */); if (ret == -1) { PrintSystemError(errno); ret = munmap(tmem, size); if (ret == -1) { PrintSystemError(errno); } + if (-1 == munmap(nmem, size)) PrintSystemError(errno); return -1; } memcpy(start, nmem, size); @@ -369,6 +367,7 @@ MoveTextRegionToLargePages(const text_region& r) { MAP_ALIGNED_SUPER, -1 , 0); if (tmem == MAP_FAILED) { PrintSystemError(errno); + if (-1 == munmap(nmem, size)) PrintSystemError(errno); return -1; } #elif defined(__APPLE__) @@ -383,6 +382,7 @@ MoveTextRegionToLargePages(const text_region& r) { VM_FLAGS_SUPERPAGE_SIZE_2MB, 0); if (tmem == MAP_FAILED) { PrintSystemError(errno); + if (-1 == munmap(nmem, size)) PrintSystemError(errno); return -1; } memcpy(tmem, nmem, size); @@ -393,6 +393,7 @@ MoveTextRegionToLargePages(const text_region& r) { if (ret == -1) { PrintSystemError(errno); } + if (-1 == munmap(nmem, size)) PrintSystemError(errno); return -1; } memcpy(start, tmem, size); @@ -405,8 +406,10 @@ MoveTextRegionToLargePages(const text_region& r) { if (ret == -1) { PrintSystemError(errno); } + if (-1 == munmap(nmem, size)) PrintSystemError(errno); return -1; } + if (-1 == munmap(nmem, size)) PrintSystemError(errno); return ret; } @@ -418,12 +421,12 @@ int MapStaticCodeToLargePages() { return -1; } -#if defined(__linux__) +#if defined(__linux__) || defined(__FreeBSD__) if (r.from > reinterpret_cast<void*>(&MoveTextRegionToLargePages)) return MoveTextRegionToLargePages(r); return -1; -#elif defined(__FreeBSD__) || defined(__APPLE__) +#elif defined(__APPLE__) return MoveTextRegionToLargePages(r); #endif } |