diff options
| author | Alexei Starovoitov <ast@kernel.org> | 2026-02-19 22:29:41 +0300 |
|---|---|---|
| committer | Alexei Starovoitov <ast@kernel.org> | 2026-02-19 22:29:42 +0300 |
| commit | 9cd168a2720bc614647dd20bc5d1c308c56a44ec (patch) | |
| tree | c0ed8daa5ecda9acde874b814faefdf15c2ccb15 | |
| parent | b0a67f310bfa5e13d66c9f6b4bd88ea504a576a9 (diff) | |
| parent | 18a1d365e825cf936074d53d0a91c58a995a60b0 (diff) | |
| download | linux-9cd168a2720bc614647dd20bc5d1c308c56a44ec.tar.xz | |
Merge branch 'selftests-bpf-fix-flaky-build_id-test'
Gregory Bell says:
====================
selftests/bpf: fix flaky build_id test
The build_id selftest intermittently fails with the following error:
./test_progs -t build_id/nofault-paged-out
serial_test_build_id:PASS:parse_build_id 0 nsec
subtest_nofault:PASS:skel_open 0 nsec
subtest_nofault:PASS:link 0 nsec
subtest_nofault:PASS:trigger_uprobe 0 nsec
subtest_nofault:PASS:res 0 nsec
subtest_nofault:FAIL:build_id_status unexpected build_id_status: actual 1 != expected 2
46/1 build_id/nofault-paged-out:FAIL
46 build_id:FAIL
397 stacktrace_build_id:OK
398 stacktrace_build_id_nmi:OK
On RHEL we consistently hit the reported failure on the first run of
the test following installation, after which subsequent runs pass.
This patch implements the approach discussed in the following thread:
https://lore.kernel.org/all/CAEf4BzYWVtfZh07iQm5Fo=kMm+8hgAu+rXRx1uLRHz07wc59+Q@mail.gmail.com/
Following the discussion, the fix makes the test verify eviction rather
than assuming it. In the discussion it was recommended to add a sleep before
and after the madvise operations, this did not resolve the issue in our case,
rather the test timed out every time. I was successful by retrying the
page-out sequence until the page is actually evicted.
Additionally, the mapping alignment is increased to
64K so the test operates on a properly page-aligned buffer across
supported architectures.
changelog:
- fixed indentations
- removed trailing whitespace
- add space between opening and closing brackets
====================
Link: https://patch.msgid.link/cover.1771338492.git.grbell@redhat.com
Signed-off-by: Alexei Starovoitov <ast@kernel.org>
| -rw-r--r-- | tools/testing/selftests/bpf/uprobe_multi.c | 19 | ||||
| -rw-r--r-- | tools/testing/selftests/bpf/uprobe_multi.ld | 4 |
2 files changed, 18 insertions, 5 deletions
diff --git a/tools/testing/selftests/bpf/uprobe_multi.c b/tools/testing/selftests/bpf/uprobe_multi.c index dd38dc68f635..3e58a86b8e25 100644 --- a/tools/testing/selftests/bpf/uprobe_multi.c +++ b/tools/testing/selftests/bpf/uprobe_multi.c @@ -100,6 +100,9 @@ int __attribute__((weak)) trigger_uprobe(bool build_id_resident) int page_sz = sysconf(_SC_PAGESIZE); void *addr; + unsigned char vec[1]; + int poll = 0; + /* page-align build ID start */ addr = (void *)((uintptr_t)&build_id_start & ~(page_sz - 1)); @@ -108,9 +111,19 @@ int __attribute__((weak)) trigger_uprobe(bool build_id_resident) * 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); - + if (!build_id_resident) { + do { + madvise(addr, page_sz, MADV_PAGEOUT); + /* check if page has been evicted */ + mincore(addr, page_sz, vec); + if (!(vec[0] & 1)) + break; + /* if page is still resident re-attempt MADV_POPULATE_READ/MADV_PAGEOUT */ + madvise(addr, page_sz, MADV_POPULATE_READ); + poll++; + usleep(100); + } while (poll < 500); + } (void)uprobe(); return 0; diff --git a/tools/testing/selftests/bpf/uprobe_multi.ld b/tools/testing/selftests/bpf/uprobe_multi.ld index a2e94828bc8c..2063714b2899 100644 --- a/tools/testing/selftests/bpf/uprobe_multi.ld +++ b/tools/testing/selftests/bpf/uprobe_multi.ld @@ -1,8 +1,8 @@ SECTIONS { - . = ALIGN(4096); + . = ALIGN(65536); .note.gnu.build-id : { *(.note.gnu.build-id) } - . = ALIGN(4096); + . = ALIGN(65536); } INSERT AFTER .text; |
