-
Notifications
You must be signed in to change notification settings - Fork 30k
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
src: find .text section using dl_iterate_phdr #32244
Conversation
efd3932
to
b53d3cd
Compare
There was a problem hiding this 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
Outdated
uintptr_t end = start + phdr->p_memsz; | ||
|
||
if (dl_params->reference_sym >= start && | ||
dl_params->reference_sym <= end) { |
There was a problem hiding this comment.
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) {
// ...
}
There was a problem hiding this comment.
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.
src/large_pages/node_large_page.cc
Outdated
} | ||
} | ||
return 0; | ||
}, &dl_params) == 1) { |
There was a problem hiding this comment.
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)) {
// ...
}
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; | ||
} | ||
} | ||
} |
There was a problem hiding this comment.
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.
There was a problem hiding this comment.
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.
@bnoordhuis I addressed your review comments and added some sanity checks wrt. your comment regarding inclusive/exclusive comparison. |
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]>
Co-Authored-By: Ben Noordhuis <[email protected]>
af31134
to
2d6be5e
Compare
Rebased in the hope that if fixes the "node ASAN" test. |
@nodejs/collaborators sorry about the spam! Can this land without the "node ASAN" test? AFAICT it's failing for a lot of PRs. |
Yes. 👍 |
We dealt with Also |
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]>
Landed in 25cb855. |
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]>
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]>
Depends on the large pages change to land on v12.x |
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]>
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]>
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), orvcbuild test
(Windows) passes