linux-mm.kvack.org archive mirror
 help / color / mirror / Atom feed
From: Andrii Nakryiko <andrii.nakryiko@gmail.com>
To: Saket Kumar Bhaskar <skb99@linux.ibm.com>
Cc: Jiri Olsa <olsajiri@gmail.com>,
	Andrii Nakryiko <andrii@kernel.org>,
	bpf@vger.kernel.org,  linux-mm@kvack.org,
	akpm@linux-foundation.org, adobriyan@gmail.com,
	 shakeel.butt@linux.dev, hannes@cmpxchg.org, ak@linux.intel.com,
	 osandov@osandov.com, song@kernel.org, hbathini@linux.ibm.com,
	 donettom@linux.ibm.com
Subject: Re: [PATCH v2 bpf-next 10/10] selftests/bpf: add build ID tests
Date: Wed, 10 Sep 2025 10:18:53 -0400	[thread overview]
Message-ID: <CAEf4BzYWVtfZh07iQm5Fo=kMm+8hgAu+rXRx1uLRHz07wc59+Q@mail.gmail.com> (raw)
In-Reply-To: <aMEWKR2QPQtRMxp7@linux.ibm.com>

On Wed, Sep 10, 2025 at 2:10 AM Saket Kumar Bhaskar <skb99@linux.ibm.com> wrote:
>
> On Tue, Jul 30, 2024 at 01:03:17PM -0700, Andrii Nakryiko wrote:
> > On Sun, Jul 28, 2024 at 12:38 PM Jiri Olsa <olsajiri@gmail.com> wrote:
> > >
> > > On Fri, Jul 26, 2024 at 05:37:55PM -0700, Andrii Nakryiko wrote:
> > > > On Fri, Jul 26, 2024 at 5:27 AM Jiri Olsa <olsajiri@gmail.com> wrote:
> > > > >
> > > > > On Thu, Jul 25, 2024 at 01:03:55PM -0700, Andrii Nakryiko wrote:
> > > > > > On Thu, Jul 25, 2024 at 5:12 AM Jiri Olsa <olsajiri@gmail.com> wrote:
> > > > > > >
> > > > > > > On Wed, Jul 24, 2024 at 03:52:10PM -0700, Andrii Nakryiko wrote:
> > > > > > > > Add a new set of tests validating behavior of capturing stack traces
> > > > > > > > with build ID. We extend uprobe_multi target binary with ability to
> > > > > > > > trigger uprobe (so that we can capture stack traces from it), but also
> > > > > > > > we allow to force build ID data to be either resident or non-resident in
> > > > > > > > memory (see also a comment about quirks of MADV_PAGEOUT).
> > > > > > > >
> > > > > > > > That way we can validate that in non-sleepable context we won't get
> > > > > > > > build ID (as expected), but with sleepable uprobes we will get that
> > > > > > > > build ID regardless of it being physically present in memory.
> > > > > > > >
> > > > > > > > Also, we add a small add-on linker script which reorders
> > > > > > > > .note.gnu.build-id section and puts it after (big) .text section,
> > > > > > > > putting build ID data outside of the very first page of ELF file. This
> > > > > > > > will test all the relaxations we did in build ID parsing logic in kernel
> > > > > > > > thanks to freader abstraction.
> > > > > > > >
> > > > > > > > Signed-off-by: Andrii Nakryiko <andrii@kernel.org>
> > > > > > >
> > > > > > > one of my bpf selftests runs showed:
> > > > > > >
> > > > > > > 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
> > > > > > > #42/1    build_id/nofault-paged-out:FAIL
> > > > > > > #42/2    build_id/nofault-paged-in:OK
> > > > > > > #42/3    build_id/sleepable:OK
> > > > > > > #42      build_id:FAIL
> > > > > > >
> > > > > > > I could never reproduce again.. but I wonder the the page could sneak
> > > > > > > in before the bpf program is hit and the buildid will get parsed?
> > > > > > >
> > > > > >
> > > > > > Yes, and I just realized that I forgot to mark this test as serial. If
> > > > > > there is parallel test that also runs uprobe_multi and that causes
> > > > > > build_id page to be paged in into page cache, then this might succeed.
> > > > > > So I need to mark the test itself serial.
> > > > > >
> > > > > > Another issue which I was debugging (and fixed) yesterday was that if
> > > > > > the memory passed for MADV_PAGEOUT is not yet memory mapped into the
> > > > > > current process, then it won't be really removed from the page cache.
> > > > > > I avoid that by first paging it in, and then MADV_PAGEOUT.
> > > > >
> > > > > ok, I triggered that in serial run, so I probably hit this one
> > > > >
> > > >
> > > > you did it with v2 of the patch set? I had this bug in v1, but v2
> > > > should be fine, as far as I understand (due to unconditional
> > > > madvise(addr, page_sz, MADV_POPULATE_READ); before madvise(addr,
> > > > page_sz, MADV_PAGEOUT)). At least I haven't been able to reproduce
> > > > that anymore and BPF CI is now happy as well.
> > >
> > > yes, it's with v2 and I can still see that.. but only for the first run of
> > > the test after reboot.. so far I have no clue.. I can see the successful
> > > page-out madvise (still not sure how much is that telling about the page
> > > being paged out), and then the build id code sees the page just fine
> > >
> > > attaching my .config in case
> > >
> >
> > I wasn't able to repro this, sorry. It works very reliably for me with
> > your or my config. Given it also seems to work reliably in BPF CI, I'm
> > still inclined to add this tests, I think it's good to have that
> > coverage.
> >
> > I'll monitor, and if it becomes flaky, we'll need to reassess this, of course.
> >
> Hi Andrii and Jirka,
>
> I encountered this error on powerpc, which is happening quiet consistently:
>
> # ./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
>
> I dumped vma mapping using pmap in trigger_uprobe function
> before/after MADV_POPULATE_READ and b/w MADV_POPULATE_READ
> and MADV_PAGEOUT, page residency using mincore() (as shown
> "Before uprobe: Page residency = ") and addr (as shown
> "Entered trigger_uprobe addr ->").
>
> Here I am putting out 3 scenarios:
>
> 1. #./test_progs -t build_id/nofault-paged-out
> Entered trigger_uprobe addr -> 0x105a0000
> 144992:   ./uprobe_multi uprobe-paged-out
> Address           Kbytes     RSS   Dirty Mode  Mapping
> 0000000010000000    7744     704      64 r-x-- uprobe_multi
> 0000000010790000      64      64      64 r---- uprobe_multi
> 00000000107a0000      64      64      64 rw--- uprobe_multi
> 000001002bf90000     192      64      64 rw---   [ anon ]
> 00007fffb55d0000     832      64       0 r-x-- libzstd.so.1.5.5
> 00007fffb56a0000      64      64      64 r---- libzstd.so.1.5.5
> 00007fffb56b0000      64      64      64 rw--- libzstd.so.1.5.5
> 00007fffb56c0000    2304    1280       0 r-x-- libc.so.6
> 00007fffb5900000      64      64      64 r---- libc.so.6
> 00007fffb5910000      64      64      64 rw--- libc.so.6
> 00007fffb5920000     192      64       0 r-x-- libz.so.1.3.1.zlib-ng
> 00007fffb5950000      64      64      64 r---- libz.so.1.3.1.zlib-ng
> 00007fffb5960000      64      64      64 rw--- libz.so.1.3.1.zlib-ng
> 00007fffb5970000     192      64       0 r-x-- libelf-0.192.so
> 00007fffb59a0000      64      64      64 r---- libelf-0.192.so
> 00007fffb59b0000      64       0       0 rw---   [ anon ]
> 00007fffb59d0000     256       0       0 r----   [ anon ]
> 00007fffb5a10000      64      64       0 r-x--   [ anon ]
> 00007fffb5a20000     320     320       0 r-x-- ld64.so.2
> 00007fffb5a70000      64      64      64 r---- ld64.so.2
> 00007fffb5a80000      64      64      64 rw--- ld64.so.2
> 00007fffee7a0000     192      64      64 rw---   [ stack ]
> ---------------- ------- ------- -------
> total kB           13056    3392     896
> 144992:   ./uprobe_multi uprobe-paged-out
> Address           Kbytes     RSS   Dirty Mode  Mapping
> 0000000010000000    7744     704      64 r-x-- uprobe_multi
> 0000000010790000      64      64      64 r---- uprobe_multi
> 00000000107a0000      64      64      64 rw--- uprobe_multi
> 000001002bf90000     192      64      64 rw---   [ anon ]
> 00007fffb55d0000     832      64       0 r-x-- libzstd.so.1.5.5
> 00007fffb56a0000      64      64      64 r---- libzstd.so.1.5.5
> 00007fffb56b0000      64      64      64 rw--- libzstd.so.1.5.5
> 00007fffb56c0000    2304    1344       0 r-x-- libc.so.6
> 00007fffb5900000      64      64      64 r---- libc.so.6
> 00007fffb5910000      64      64      64 rw--- libc.so.6
> 00007fffb5920000     192      64       0 r-x-- libz.so.1.3.1.zlib-ng
> 00007fffb5950000      64      64      64 r---- libz.so.1.3.1.zlib-ng
> 00007fffb5960000      64      64      64 rw--- libz.so.1.3.1.zlib-ng
> 00007fffb5970000     192      64       0 r-x-- libelf-0.192.so
> 00007fffb59a0000      64      64      64 r---- libelf-0.192.so
> 00007fffb59b0000      64       0       0 rw---   [ anon ]
> 00007fffb59d0000     256       0       0 r----   [ anon ]
> 00007fffb5a10000      64      64       0 r-x--   [ anon ]
> 00007fffb5a20000     320     320       0 r-x-- ld64.so.2
> 00007fffb5a70000      64      64      64 r---- ld64.so.2
> 00007fffb5a80000      64      64      64 rw--- ld64.so.2
> 00007fffee7a0000     192      64      64 rw---   [ stack ]
> ---------------- ------- ------- -------
> total kB           13056    3456     896
> 144992:   ./uprobe_multi uprobe-paged-out
> Address           Kbytes     RSS   Dirty Mode  Mapping
> 0000000010000000    7744     704      64 r-x-- uprobe_multi
> 0000000010790000      64      64      64 r---- uprobe_multi
> 00000000107a0000      64      64      64 rw--- uprobe_multi
> 000001002bf90000     192      64      64 rw---   [ anon ]
> 00007fffb55d0000     832      64       0 r-x-- libzstd.so.1.5.5
> 00007fffb56a0000      64      64      64 r---- libzstd.so.1.5.5
> 00007fffb56b0000      64      64      64 rw--- libzstd.so.1.5.5
> 00007fffb56c0000    2304    1344       0 r-x-- libc.so.6
> 00007fffb5900000      64      64      64 r---- libc.so.6
> 00007fffb5910000      64      64      64 rw--- libc.so.6
> 00007fffb5920000     192      64       0 r-x-- libz.so.1.3.1.zlib-ng
> 00007fffb5950000      64      64      64 r---- libz.so.1.3.1.zlib-ng
> 00007fffb5960000      64      64      64 rw--- libz.so.1.3.1.zlib-ng
> 00007fffb5970000     192      64       0 r-x-- libelf-0.192.so
> 00007fffb59a0000      64      64      64 r---- libelf-0.192.so
> 00007fffb59b0000      64       0       0 rw---   [ anon ]
> 00007fffb59d0000     256       0       0 r----   [ anon ]
> 00007fffb5a10000      64      64       0 r-x--   [ anon ]
> 00007fffb5a20000     320     320       0 r-x-- ld64.so.2
> 00007fffb5a70000      64      64      64 r---- ld64.so.2
> 00007fffb5a80000      64      64      64 rw--- ld64.so.2
> 00007fffee7a0000     192      64      64 rw---   [ stack ]
> ---------------- ------- ------- -------
> total kB           13056    3456     896
> Before uprobe: Page residency = resident
> After uprobe: Page residency = resident
> 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
>
> All error logs:
> 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
> Summary: 2/0 PASSED, 0 SKIPPED, 1 FAILED
>
> Here it can be seen that RSS for vma containing addr (0x105a0000)
> is not changing (remains 704) and the selftest fails.
>
> 2. When alignment in linker script is changed to 65536 (default
>    page size in powerpc is 64k):
>
> git diff uprobe_multi.ld
> diff --git a/tools/testing/selftests/bpf/uprobe_multi.ld b/tools/testing/selftests/bpf/uprobe_multi.ld
> index a2e94828b..2063714b2 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;
>
> #./test_progs -t build_id/nofault-paged-out -v
> bpf_testmod.ko is already unloaded.
> Loading bpf_testmod.ko...
> Successfully loaded bpf_testmod.ko.
> serial_test_build_id:PASS:parse_build_id 0 nsec
> subtest_nofault:PASS:skel_open 0 nsec
> subtest_nofault:PASS:link 0 nsec
> Entered trigger_uprobe addr -> 0x105b0000
> 145238:   ./uprobe_multi uprobe-paged-out
> Address           Kbytes     RSS   Dirty Mode  Mapping
> 0000000010000000    7872     768     768 r-x-- uprobe_multi
> 00000000107b0000      64      64      64 r---- uprobe_multi
> 00000000107c0000      64      64      64 rw--- uprobe_multi
> 000001003a6b0000     192      64      64 rw---   [ anon ]
> 00007fffa3eb0000     832      64       0 r-x-- libzstd.so.1.5.5
> 00007fffa3f80000      64      64      64 r---- libzstd.so.1.5.5
> 00007fffa3f90000      64      64      64 rw--- libzstd.so.1.5.5
> 00007fffa3fa0000    2304    1280       0 r-x-- libc.so.6
> 00007fffa41e0000      64      64      64 r---- libc.so.6
> 00007fffa41f0000      64      64      64 rw--- libc.so.6
> 00007fffa4200000     192      64       0 r-x-- libz.so.1.3.1.zlib-ng
> 00007fffa4230000      64      64      64 r---- libz.so.1.3.1.zlib-ng
> 00007fffa4240000      64      64      64 rw--- libz.so.1.3.1.zlib-ng
> 00007fffa4250000     192      64       0 r-x-- libelf-0.192.so
> 00007fffa4280000      64      64      64 r---- libelf-0.192.so
> 00007fffa4290000      64       0       0 rw---   [ anon ]
> 00007fffa42b0000     256       0       0 r----   [ anon ]
> 00007fffa42f0000      64      64       0 r-x--   [ anon ]
> 00007fffa4300000     320     320       0 r-x-- ld64.so.2
> 00007fffa4350000      64      64      64 r---- ld64.so.2
> 00007fffa4360000      64      64      64 rw--- ld64.so.2
> 00007fffc6880000     192      64      64 rw---   [ stack ]
> ---------------- ------- ------- -------
> total kB           13184    3456    1600
> 145238:   ./uprobe_multi uprobe-paged-out
> Address           Kbytes     RSS   Dirty Mode  Mapping
> 0000000010000000    7872     832     832 r-x-- uprobe_multi
> 00000000107b0000      64      64      64 r---- uprobe_multi
> 00000000107c0000      64      64      64 rw--- uprobe_multi
> 000001003a6b0000     192      64      64 rw---   [ anon ]
> 00007fffa3eb0000     832      64       0 r-x-- libzstd.so.1.5.5
> 00007fffa3f80000      64      64      64 r---- libzstd.so.1.5.5
> 00007fffa3f90000      64      64      64 rw--- libzstd.so.1.5.5
> 00007fffa3fa0000    2304    1344       0 r-x-- libc.so.6
> 00007fffa41e0000      64      64      64 r---- libc.so.6
> 00007fffa41f0000      64      64      64 rw--- libc.so.6
> 00007fffa4200000     192      64       0 r-x-- libz.so.1.3.1.zlib-ng
> 00007fffa4230000      64      64      64 r---- libz.so.1.3.1.zlib-ng
> 00007fffa4240000      64      64      64 rw--- libz.so.1.3.1.zlib-ng
> 00007fffa4250000     192      64       0 r-x-- libelf-0.192.so
> 00007fffa4280000      64      64      64 r---- libelf-0.192.so
> 00007fffa4290000      64       0       0 rw---   [ anon ]
> 00007fffa42b0000     256       0       0 r----   [ anon ]
> 00007fffa42f0000      64      64       0 r-x--   [ anon ]
> 00007fffa4300000     320     320       0 r-x-- ld64.so.2
> 00007fffa4350000      64      64      64 r---- ld64.so.2
> 00007fffa4360000      64      64      64 rw--- ld64.so.2
> 00007fffc6880000     192      64      64 rw---   [ stack ]
> ---------------- ------- ------- -------
> total kB           13184    3584    1664
> 145238:   ./uprobe_multi uprobe-paged-out
> Address           Kbytes     RSS   Dirty Mode  Mapping
> 0000000010000000    7872     768     768 r-x-- uprobe_multi
> 00000000107b0000      64      64      64 r---- uprobe_multi
> 00000000107c0000      64      64      64 rw--- uprobe_multi
> 000001003a6b0000     192      64      64 rw---   [ anon ]
> 00007fffa3eb0000     832      64       0 r-x-- libzstd.so.1.5.5
> 00007fffa3f80000      64      64      64 r---- libzstd.so.1.5.5
> 00007fffa3f90000      64      64      64 rw--- libzstd.so.1.5.5
> 00007fffa3fa0000    2304    1344       0 r-x-- libc.so.6
> 00007fffa41e0000      64      64      64 r---- libc.so.6
> 00007fffa41f0000      64      64      64 rw--- libc.so.6
> 00007fffa4200000     192      64       0 r-x-- libz.so.1.3.1.zlib-ng
> 00007fffa4230000      64      64      64 r---- libz.so.1.3.1.zlib-ng
> 00007fffa4240000      64      64      64 rw--- libz.so.1.3.1.zlib-ng
> 00007fffa4250000     192      64       0 r-x-- libelf-0.192.so
> 00007fffa4280000      64      64      64 r---- libelf-0.192.so
> 00007fffa4290000      64       0       0 rw---   [ anon ]
> 00007fffa42b0000     256       0       0 r----   [ anon ]
> 00007fffa42f0000      64      64       0 r-x--   [ anon ]
> 00007fffa4300000     320     320       0 r-x-- ld64.so.2
> 00007fffa4350000      64      64      64 r---- ld64.so.2
> 00007fffa4360000      64      64      64 rw--- ld64.so.2
> 00007fffc6880000     192      64      64 rw---   [ stack ]
> ---------------- ------- ------- -------
> total kB           13184    3520    1600
> Before uprobe: Page residency = resident
> After uprobe: Page residency = resident
> subtest_nofault:PASS:trigger_uprobe 0 nsec
> subtest_nofault:PASS:res 0 nsec
> FRAME #00: BUILD ID = 4f635d1d48e4f2b67b62a9a07285668cdc85fb18 OFFSET = 2c3f1c
> FRAME #01: BUILD ID = 4f635d1d48e4f2b67b62a9a07285668cdc85fb18 OFFSET = 5a0824
> FRAME #02: BUILD ID = 4f635d1d48e4f2b67b62a9a07285668cdc85fb18 OFFSET = 5a0994
> FRAME #03: BUILD ID = 09139ae1e5cbaf5c598222698e5b8e2e250260b1 OFFSET = 2aba4
> FRAME #04: BUILD ID = 09139ae1e5cbaf5c598222698e5b8e2e250260b1 OFFSET = 2adec
> FRAME #05: BUILD ID = 4f635d1d48e4f2b67b62a9a07285668cdc85fb18 OFFSET = fffffffff0000000
> 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
>
> Here RSS changes(768 -> 832 -> 768) but looks like page is still
> not getting evicted (as shown "Before uprobe: Page residency = resident")
> after MADV_PAGEOUT and the selftest fails.
>
> 3. But in the very next run page is evicted and selftest passes:
>
> #./test_progs -t build_id/nofault-paged-out
> Entered trigger_uprobe addr -> 0x105b0000
> 145256:   ./uprobe_multi uprobe-paged-out
> Address           Kbytes     RSS   Dirty Mode  Mapping
> 0000000010000000    7872     768      64 r-x-- uprobe_multi
> 00000000107b0000      64      64      64 r---- uprobe_multi
> 00000000107c0000      64      64      64 rw--- uprobe_multi
> 00000100317b0000     192      64      64 rw---   [ anon ]
> 00007fffa5cd0000     832      64       0 r-x-- libzstd.so.1.5.5
> 00007fffa5da0000      64      64      64 r---- libzstd.so.1.5.5
> 00007fffa5db0000      64      64      64 rw--- libzstd.so.1.5.5
> 00007fffa5dc0000    2304    1280       0 r-x-- libc.so.6
> 00007fffa6000000      64      64      64 r---- libc.so.6
> 00007fffa6010000      64      64      64 rw--- libc.so.6
> 00007fffa6020000     192      64       0 r-x-- libz.so.1.3.1.zlib-ng
> 00007fffa6050000      64      64      64 r---- libz.so.1.3.1.zlib-ng
> 00007fffa6060000      64      64      64 rw--- libz.so.1.3.1.zlib-ng
> 00007fffa6070000     192      64       0 r-x-- libelf-0.192.so
> 00007fffa60a0000      64      64      64 r---- libelf-0.192.so
> 00007fffa60b0000      64       0       0 rw---   [ anon ]
> 00007fffa60d0000     256       0       0 r----   [ anon ]
> 00007fffa6110000      64      64       0 r-x--   [ anon ]
> 00007fffa6120000     320     320       0 r-x-- ld64.so.2
> 00007fffa6170000      64      64      64 r---- ld64.so.2
> 00007fffa6180000      64      64      64 rw--- ld64.so.2
> 00007ffff1890000     192      64      64 rw---   [ stack ]
> ---------------- ------- ------- -------
> total kB           13184    3456     896
> 145256:   ./uprobe_multi uprobe-paged-out
> Address           Kbytes     RSS   Dirty Mode  Mapping
> 0000000010000000    7872     832      64 r-x-- uprobe_multi
> 00000000107b0000      64      64      64 r---- uprobe_multi
> 00000000107c0000      64      64      64 rw--- uprobe_multi
> 00000100317b0000     192      64      64 rw---   [ anon ]
> 00007fffa5cd0000     832      64       0 r-x-- libzstd.so.1.5.5
> 00007fffa5da0000      64      64      64 r---- libzstd.so.1.5.5
> 00007fffa5db0000      64      64      64 rw--- libzstd.so.1.5.5
> 00007fffa5dc0000    2304    1344       0 r-x-- libc.so.6
> 00007fffa6000000      64      64      64 r---- libc.so.6
> 00007fffa6010000      64      64      64 rw--- libc.so.6
> 00007fffa6020000     192      64       0 r-x-- libz.so.1.3.1.zlib-ng
> 00007fffa6050000      64      64      64 r---- libz.so.1.3.1.zlib-ng
> 00007fffa6060000      64      64      64 rw--- libz.so.1.3.1.zlib-ng
> 00007fffa6070000     192      64       0 r-x-- libelf-0.192.so
> 00007fffa60a0000      64      64      64 r---- libelf-0.192.so
> 00007fffa60b0000      64       0       0 rw---   [ anon ]
> 00007fffa60d0000     256       0       0 r----   [ anon ]
> 00007fffa6110000      64      64       0 r-x--   [ anon ]
> 00007fffa6120000     320     320       0 r-x-- ld64.so.2
> 00007fffa6170000      64      64      64 r---- ld64.so.2
> 00007fffa6180000      64      64      64 rw--- ld64.so.2
> 00007ffff1890000     192      64      64 rw---   [ stack ]
> ---------------- ------- ------- -------
> total kB           13184    3584     896
> 145256:   ./uprobe_multi uprobe-paged-out
> Address           Kbytes     RSS   Dirty Mode  Mapping
> 0000000010000000    7872     768      64 r-x-- uprobe_multi
> 00000000107b0000      64      64      64 r---- uprobe_multi
> 00000000107c0000      64      64      64 rw--- uprobe_multi
> 00000100317b0000     192      64      64 rw---   [ anon ]
> 00007fffa5cd0000     832      64       0 r-x-- libzstd.so.1.5.5
> 00007fffa5da0000      64      64      64 r---- libzstd.so.1.5.5
> 00007fffa5db0000      64      64      64 rw--- libzstd.so.1.5.5
> 00007fffa5dc0000    2304    1344       0 r-x-- libc.so.6
> 00007fffa6000000      64      64      64 r---- libc.so.6
> 00007fffa6010000      64      64      64 rw--- libc.so.6
> 00007fffa6020000     192      64       0 r-x-- libz.so.1.3.1.zlib-ng
> 00007fffa6050000      64      64      64 r---- libz.so.1.3.1.zlib-ng
> 00007fffa6060000      64      64      64 rw--- libz.so.1.3.1.zlib-ng
> 00007fffa6070000     192      64       0 r-x-- libelf-0.192.so
> 00007fffa60a0000      64      64      64 r---- libelf-0.192.so
> 00007fffa60b0000      64       0       0 rw---   [ anon ]
> 00007fffa60d0000     256       0       0 r----   [ anon ]
> 00007fffa6110000      64      64       0 r-x--   [ anon ]
> 00007fffa6120000     320     320       0 r-x-- ld64.so.2
> 00007fffa6170000      64      64      64 r---- ld64.so.2
> 00007fffa6180000      64      64      64 rw--- ld64.so.2
> 00007ffff1890000     192      64      64 rw---   [ stack ]
> ---------------- ------- ------- -------
> total kB           13184    3520     896
> Before uprobe: Page residency = paged out
> After uprobe: Page residency = paged out
> #46/1    build_id/nofault-paged-out:OK
> #46      build_id:OK
> #397     stacktrace_build_id:OK
> #398     stacktrace_build_id_nmi:OK
> Summary: 3/1 PASSED, 0 SKIPPED, 0 FAILED
>
> Here it can be seen that page is evicted (as shown
> "Before uprobe: Page residency = paged out").
>
> Although the selftest occasionally passes, its behavior
> remains flaky and unreliable across runs. But introducing
> a sleep before/after both MADV_POPULATE_READ and MADV_PAGEOUT
> tends to improve the consistency with which the selftest passes.
>
> Your valuable suggestions or thoughts on how best to address/debug
> this further would be helpful.
>

How do you check page residency? Instead of just sleeping, I'd add the
code that just waits for the page to be non-resident (with some
reasonable time out in case of bugs), and wait until that condition
happens. (And of course let's increase alignment to 64KB, it has to be
page-aligned across supported architectures).

> Regards,
> Saket
> > > jirka
> > >
> > >
> > > ----
> > > #
> > > # Automatically generated file; DO NOT EDIT.
> > > # Linux/x86 6.10.0 Kernel Configuration
> > > #
> >
> > [...]
> >


      reply	other threads:[~2025-09-10 14:19 UTC|newest]

Thread overview: 35+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2024-07-24 22:52 [PATCH v2 bpf-next 00/10] Harden and extend ELF build ID parsing logic Andrii Nakryiko
2024-07-24 22:52 ` [PATCH v2 bpf-next 01/10] lib/buildid: add single page-based file reader abstraction Andrii Nakryiko
2024-07-25 12:03   ` Jiri Olsa
2024-07-25 19:58     ` Andrii Nakryiko
2024-07-26 12:31       ` Jiri Olsa
2024-07-25 22:43   ` Andi Kleen
2024-07-27  0:26     ` Andrii Nakryiko
2024-07-24 22:52 ` [PATCH v2 bpf-next 02/10] lib/buildid: take into account e_phoff when fetching program headers Andrii Nakryiko
2024-07-25 12:03   ` Jiri Olsa
2024-07-25 19:59     ` Andrii Nakryiko
2024-07-25 22:45   ` Andi Kleen
2024-07-27  0:30     ` Andrii Nakryiko
2024-07-24 22:52 ` [PATCH v2 bpf-next 03/10] lib/buildid: remove single-page limit for PHDR search Andrii Nakryiko
2024-07-24 22:52 ` [PATCH v2 bpf-next 04/10] lib/buildid: rename build_id_parse() into build_id_parse_nofault() Andrii Nakryiko
2024-07-24 22:52 ` [PATCH v2 bpf-next 05/10] lib/buildid: implement sleepable build_id_parse() API Andrii Nakryiko
2024-07-25 22:46   ` Andi Kleen
2024-07-27  0:36     ` Andrii Nakryiko
2024-07-24 22:52 ` [PATCH v2 bpf-next 06/10] lib/buildid: don't limit .note.gnu.build-id to the first page in ELF Andrii Nakryiko
2024-07-24 22:52 ` [PATCH v2 bpf-next 07/10] lib/buildid: harden build ID parsing logic some more Andrii Nakryiko
2024-07-29 16:15   ` Jann Horn
2024-07-29 16:57     ` Andrii Nakryiko
2024-07-24 22:52 ` [PATCH v2 bpf-next 08/10] bpf: decouple stack_map_get_build_id_offset() from perf_callchain_entry Andrii Nakryiko
2024-07-24 22:52 ` [PATCH v2 bpf-next 09/10] bpf: wire up sleepable bpf_get_stack() and bpf_get_task_stack() helpers Andrii Nakryiko
2024-07-24 22:52 ` [PATCH v2 bpf-next 10/10] selftests/bpf: add build ID tests Andrii Nakryiko
2024-07-25 12:04   ` Jiri Olsa
2024-07-25 20:01     ` Andrii Nakryiko
2024-07-25 12:12   ` Jiri Olsa
2024-07-25 20:03     ` Andrii Nakryiko
2024-07-26 12:27       ` Jiri Olsa
2024-07-27  0:37         ` Andrii Nakryiko
2024-07-28 19:38           ` Jiri Olsa
2024-07-30 20:03             ` Andrii Nakryiko
2024-07-30 20:18               ` Jiri Olsa
2025-09-10  6:09               ` Saket Kumar Bhaskar
2025-09-10 14:18                 ` Andrii Nakryiko [this message]

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to='CAEf4BzYWVtfZh07iQm5Fo=kMm+8hgAu+rXRx1uLRHz07wc59+Q@mail.gmail.com' \
    --to=andrii.nakryiko@gmail.com \
    --cc=adobriyan@gmail.com \
    --cc=ak@linux.intel.com \
    --cc=akpm@linux-foundation.org \
    --cc=andrii@kernel.org \
    --cc=bpf@vger.kernel.org \
    --cc=donettom@linux.ibm.com \
    --cc=hannes@cmpxchg.org \
    --cc=hbathini@linux.ibm.com \
    --cc=linux-mm@kvack.org \
    --cc=olsajiri@gmail.com \
    --cc=osandov@osandov.com \
    --cc=shakeel.butt@linux.dev \
    --cc=skb99@linux.ibm.com \
    --cc=song@kernel.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox