selftests/bpf: Fix sockmap_multi_channels reliability
Subsystems (3)
PATCH 1/1 selftests/bpf: Fix sockmap_multi_channels reliability
From: Jiayuan Chen <[email protected]>
Previously I added a FIONREAD test for sockmap, but it can occasionally fail in CI [1].
The test sends 10 bytes in two segments (2 + 8). For UDP, FIONREAD only reports the length of the first datagram, not the total queued data. The original code used recv_timeout() expecting all 10 bytes, but under high system load, the second datagram may not yet be processed by the protocol stack, so recv would only return the first 2-byte datagram, causing a size mismatch failure.
Fix this by receiving exactly the expected bytes (matching FIONREAD) in the first recv. The remaining datagram is then consumed in a second recv block, which is only reachable for UDP since TCP's expected already equals sizeof(buf).
Test:
./test_progs -a sockmap_basic
410/1 sockmap_basic/sockmap create_update_free:OK
...
Summary: 1/35 PASSED, 0 SKIPPED, 0 FAILED
[1] https://github.com/kernel-patches/bpf/actions/runs/22919385910/job/66515395423
--- .../selftests/bpf/prog_tests/sockmap_basic.c | 17 +++++++++++++++-- 1 file changed, 15 insertions(+), 2 deletions(-)
tools/testing/selftests/bpf/prog_tests/sockmap_basic.c +15 -2
@@ -1298,10 +1298,23 @@ static void test_sockmap_multi_channels(int sotype) avail =wait_for_fionread (p1, expected,IO_TIMEOUT_SEC );ASSERT_EQ (avail, expected,"ioctl(FIONREAD) full return" ); - recvd =recv_timeout (p1, rcv,sizeof (rcv),MSG_DONTWAIT ,1 ); -if (!ASSERT_EQ (recvd,sizeof (buf),"recv_timeout(p1)" ) || + recvd =recv_timeout (p1, rcv, expected,MSG_DONTWAIT ,1 ); +if (!ASSERT_EQ (recvd, expected,"recv_timeout(p1)" ) || !ASSERT_OK (memcmp (buf, rcv, recvd),"data mismatch" )) goto end; + +/* process remaining data for udp if secondary data is available */ + expected =sizeof (buf) - expected; +if (expected) { + avail =wait_for_fionread (p1, expected,IO_TIMEOUT_SEC ); +ASSERT_EQ (avail, expected,"second ioctl(FIONREAD) full return" ); + + recvd =recv_timeout (p1, rcv, expected,MSG_DONTWAIT ,1 ); +if (!ASSERT_EQ (recvd, expected,"second recv_timeout(p1)" ) || + !ASSERT_OK (memcmp (buf +sizeof (buf) - expected, rcv, recvd), +"second data mismatch" )) + goto end; + } end:if (c0 >=0 )close (c0);
Signature · 1 line
2.43.0
This patch was applied to bpf/bpf-next.git (master) by Alexei Starovoitov <[email protected]>:
Hello:
This patch was applied to bpf/bpf-next.git (master) by Alexei Starovoitov <[email protected]>:
Quoted 5 lines · On Thu, 12 Mar 2026 15:25:44 +0800 you wrote:
From: Jiayuan Chen <[email protected]>
Previously I added a FIONREAD test for sockmap, but it can occasionally fail in CI [1].
Quoted 8 lines
The test sends 10 bytes in two segments (2 + 8). For UDP, FIONREAD only reports the length of the first datagram, not the total queued data. The original code used
recv_timeout()expecting all 10 bytes, but under high system load, the second datagram may not yet be processed by the protocol stack, so recv would only return the first 2-byte datagram, causing a size mismatch failure.[...]
Here is the summary with links:
- [bpf,v1] selftests/bpf: Fix sockmap_multi_channels reliability
https://git.kernel.org/bpf/bpf-next/c/d9d7125e445d
You are awesome, thank you!
Signature · 2 lines
Deet-doot-dot, I am a bot. https://korg.docs.kernel.org/patchwork/pwbot.html