Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

src: find .text section using dl_iterate_phdr #32244

Conversation

gabrielschulhof
Copy link
Contributor

Use dl_iterate_phdr(3) to find the mapping containing
__node_text_start instead of parsing /proc/self/maps.

Signed-off-by: @gabrielschulhof

Checklist
  • make -j4 test (UNIX), or vcbuild test (Windows) passes
  • commit message follows commit guidelines

@nodejs-github-bot nodejs-github-bot added the c++ Issues and PRs that require attention from people who are familiar with C++. label Mar 13, 2020
@nodejs-github-bot
Copy link
Collaborator

@gabrielschulhof gabrielschulhof force-pushed the large-pages-use-dl_iterate_phdr branch from efd3932 to b53d3cd Compare March 13, 2020 07:01
@nodejs-github-bot
Copy link
Collaborator

Copy link
Member

@bnoordhuis bnoordhuis left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

LGTM % some minor (mostly style) issues.

src/large_pages/node_large_page.cc Show resolved Hide resolved
src/large_pages/node_large_page.cc Outdated Show resolved Hide resolved
src/large_pages/node_large_page.cc Outdated Show resolved Hide resolved
uintptr_t end = start + phdr->p_memsz;

if (dl_params->reference_sym >= start &&
dl_params->reference_sym <= end) {
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Just checking, is end inclusive or exclusive?

Aside: it looks like there's no real need for the dl_params->reference_sym field. This also works, wouldn't it?

auto reference_sym = reinterpret_cast<uintptr_t>(&__node_text_start);
if (reference_sym >= start && reference_sym <= end) {
  // ...
}

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@bnoordhuis the reference_sym field is being used both inside the dl_iterate_phdr callback and outside of it. I thought it best not to assign reinterpret_cast<uintptr_t>(&__node_text_start); to two different variables because, if the symbol changes in the future, they might get out of sync.

}
}
return 0;
}, &dl_params) == 1) {
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

For legibility, it'd be better to hoist the lambda out of the function call:

auto callback = [](dl_phdr_info* info, size_t, void* data) -> int {
  // ...
};

if (1 == dl_iterate_phdr(callback, &dl_params)) {
  // ...
}

src/large_pages/node_large_page.cc Show resolved Hide resolved
Comment on lines +157 to +171
if (dl_params.start < dl_params.end) {
char* from = reinterpret_cast<char*>(hugepage_align_up(dl_params.start));
char* to = reinterpret_cast<char*>(hugepage_align_down(dl_params.end));
if (from < to) {
size_t pagecount = (to - from) / hps;
if (pagecount > 0) {
nregion.found_text_region = true;
nregion.from = from;
nregion.to = to;
nregion.total_hugepages = pagecount;
}
}
}
Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@bnoordhuis I added some more sanity checks to ensure that we create a region that has proper offsets and > 0 page count.

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

... or rather, that we consider the region to have been found only if it has proper offsets and >0 page count.

@gabrielschulhof
Copy link
Contributor Author

@bnoordhuis I addressed your review comments and added some sanity checks wrt. your comment regarding inclusive/exclusive comparison.

@nodejs-github-bot
Copy link
Collaborator

@nodejs-github-bot
Copy link
Collaborator

@nodejs-github-bot
Copy link
Collaborator

Gabriel Schulhof and others added 6 commits March 13, 2020 14:46
@gabrielschulhof gabrielschulhof force-pushed the large-pages-use-dl_iterate_phdr branch from af31134 to 2d6be5e Compare March 13, 2020 21:46
@gabrielschulhof
Copy link
Contributor Author

Rebased in the hope that if fixes the "node ASAN" test.

@nodejs-github-bot
Copy link
Collaborator

@nodejs-github-bot
Copy link
Collaborator

@gabrielschulhof
Copy link
Contributor Author

@nodejs/collaborators sorry about the spam! Can this land without the "node ASAN" test? AFAICT it's failing for a lot of PRs.

@gabrielschulhof
Copy link
Contributor Author

@addaleax
Copy link
Member

sorry about the spam! Can this land without the "node ASAN" test? AFAICT it's failing for a lot of PRs.

Yes. 👍

@addaleax addaleax added the author ready PRs that have at least one approval, no pending requests for changes, and a CI started. label Mar 15, 2020
@gengjiawen
Copy link
Member

@nodejs/collaborators sorry about the spam! Can this land without the "node ASAN" test? AFAICT it's failing for a lot of PRs.

We dealt with Node ASAN fail in #32116. Not sure we should cherrypick the commit to master, since the PR is pretty ready to launch.

Also +1 for this PR to launch.

gabrielschulhof pushed a commit that referenced this pull request Mar 16, 2020
Use `dl_iterate_phdr(3)` to find the mapping containing
`__node_text_start` instead of parsing `/proc/self/maps`.

Signed-off-by: Gabriel Schulhof <[email protected]>
Co-Authored-By: Ben Noordhuis <[email protected]>
PR-URL: #32244
Reviewed-By: Ben Noordhuis <[email protected]>
Reviewed-By: David Carlier <[email protected]>
@gabrielschulhof
Copy link
Contributor Author

Landed in 25cb855.

@gabrielschulhof gabrielschulhof deleted the large-pages-use-dl_iterate_phdr branch March 16, 2020 05:43
BridgeAR pushed a commit that referenced this pull request Mar 17, 2020
Use `dl_iterate_phdr(3)` to find the mapping containing
`__node_text_start` instead of parsing `/proc/self/maps`.

Signed-off-by: Gabriel Schulhof <[email protected]>
Co-Authored-By: Ben Noordhuis <[email protected]>
PR-URL: #32244
Reviewed-By: Ben Noordhuis <[email protected]>
Reviewed-By: David Carlier <[email protected]>
@MylesBorins MylesBorins mentioned this pull request Mar 19, 2020
MylesBorins pushed a commit that referenced this pull request Mar 24, 2020
Use `dl_iterate_phdr(3)` to find the mapping containing
`__node_text_start` instead of parsing `/proc/self/maps`.

Signed-off-by: Gabriel Schulhof <[email protected]>
Co-Authored-By: Ben Noordhuis <[email protected]>
PR-URL: #32244
Reviewed-By: Ben Noordhuis <[email protected]>
Reviewed-By: David Carlier <[email protected]>
@targos
Copy link
Member

targos commented Apr 22, 2020

Depends on the large pages change to land on v12.x

@targos targos removed author ready PRs that have at least one approval, no pending requests for changes, and a CI started. backport-blocked-v12.x labels Apr 25, 2020
targos pushed a commit to targos/node that referenced this pull request Apr 25, 2020
Use `dl_iterate_phdr(3)` to find the mapping containing
`__node_text_start` instead of parsing `/proc/self/maps`.

Signed-off-by: Gabriel Schulhof <[email protected]>
Co-Authored-By: Ben Noordhuis <[email protected]>
PR-URL: nodejs#32244
Reviewed-By: Ben Noordhuis <[email protected]>
Reviewed-By: David Carlier <[email protected]>
targos pushed a commit that referenced this pull request Apr 28, 2020
Use `dl_iterate_phdr(3)` to find the mapping containing
`__node_text_start` instead of parsing `/proc/self/maps`.

Signed-off-by: Gabriel Schulhof <[email protected]>
Co-Authored-By: Ben Noordhuis <[email protected]>
PR-URL: #32244
Reviewed-By: Ben Noordhuis <[email protected]>
Reviewed-By: David Carlier <[email protected]>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
c++ Issues and PRs that require attention from people who are familiar with C++.
Projects
None yet
Development

Successfully merging this pull request may close these issues.

7 participants