On Wed, Jul 24, 2024 at 03:52:10PM -0700, Andrii Nakryiko wrote: SNIP > +extern char build_id_start[]; > +extern char build_id_end[]; > + > +int __attribute__((weak)) trigger_uprobe(bool build_id_resident) > +{ > + int page_sz = sysconf(_SC_PAGESIZE); > + void *addr; > + > + /* page-align build ID start */ > + addr = (void *)((uintptr_t)&build_id_start & ~(page_sz - 1)); > + > + /* to guarantee MADV_PAGEOUT work reliably, we need to ensure that > + * memory range is mapped into current process, so we unconditionally > + * do MADV_POPULATE_READ, and then MADV_PAGEOUT, if necessary > + */ > + madvise(addr, page_sz, MADV_POPULATE_READ); > + if (!build_id_resident) > + madvise(addr, page_sz, MADV_PAGEOUT); could this fail? should we at least print the error, might be tricky to display that becase it's called through system() ? jirka > + > + (void)uprobe(); > + > + return 0; > +} > + > int main(int argc, char **argv) > { > if (argc != 2) > @@ -84,6 +121,10 @@ int main(int argc, char **argv) > return bench(); > if (!strcmp("usdt", argv[1])) > return usdt(); > + if (!strcmp("uprobe-paged-out", argv[1])) > + return trigger_uprobe(false /* page-out build ID */); > + if (!strcmp("uprobe-paged-in", argv[1])) > + return trigger_uprobe(true /* page-in build ID */); > > error: > fprintf(stderr, "usage: %s <bench|usdt>\n", argv[0]); > diff --git a/tools/testing/selftests/bpf/uprobe_multi.ld b/tools/testing/selftests/bpf/uprobe_multi.ld > new file mode 100644 > index 000000000000..a2e94828bc8c > --- /dev/null > +++ b/tools/testing/selftests/bpf/uprobe_multi.ld > @@ -0,0 +1,11 @@ > +SECTIONS > +{ > + . = ALIGN(4096); > + .note.gnu.build-id : { *(.note.gnu.build-id) } > + . = ALIGN(4096); > +} > +INSERT AFTER .text; > + > +build_id_start = ADDR(.note.gnu.build-id); > +build_id_end = ADDR(.note.gnu.build-id) + SIZEOF(.note.gnu.build-id); > + > -- > 2.43.0 > >