]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
selftests: tls: size splice_short pipe by page size
authorNirmoy Das <nirmoyd@nvidia.com>
Wed, 24 Jun 2026 13:44:16 +0000 (06:44 -0700)
committerJakub Kicinski <kuba@kernel.org>
Thu, 25 Jun 2026 16:01:58 +0000 (09:01 -0700)
splice_short grows its pipe with (MAX_FRAGS + 1) * 0x1000 so it can
queue one short vmsplice() buffer for each fragment before draining the
pipe. That assumes 4K pipe buffers.

On 64K-page kernels the request is rounded to 262144 bytes, which
provides only four pipe buffers. The fifth one-byte vmsplice() blocks in
pipe_wait_writable and the test times out before it reaches the TLS path.

Request enough bytes for the same number of pipe buffers using the
runtime page size, and assert that the kernel granted at least that much.
If an unprivileged run cannot raise the pipe above the system
pipe-max-size limit, skip the test because it cannot exercise the
intended path.

Fixes: 3667e9b442b9 ("selftests: tls: add test for short splice due to full skmsg")
Signed-off-by: Nirmoy Das <nirmoyd@nvidia.com>
Reviewed-by: Simon Horman <horms@kernel.org>
Link: https://patch.msgid.link/20260624134416.3235403-1-nirmoyd@nvidia.com
Signed-off-by: Jakub Kicinski <kuba@kernel.org>
tools/testing/selftests/net/tls.c

index 9b9a3cb2700d1bc54d37e1f08e138127563f6fa0..cbdd3ea28b998f7663572208eab6964dcc746b1b 100644 (file)
@@ -997,6 +997,8 @@ TEST_F(tls, splice_short)
        char sendbuf[0x100];
        char sendchar = 'S';
        int pipefds[2];
+       int pipe_sz;
+       int ret;
        int i;
 
        sendchar_iov.iov_base = &sendchar;
@@ -1005,7 +1007,11 @@ TEST_F(tls, splice_short)
        memset(sendbuf, 's', sizeof(sendbuf));
 
        ASSERT_GE(pipe2(pipefds, O_NONBLOCK), 0);
-       ASSERT_GE(fcntl(pipefds[0], F_SETPIPE_SZ, (MAX_FRAGS + 1) * 0x1000), 0);
+       pipe_sz = (MAX_FRAGS + 1) * getpagesize();
+       ret = fcntl(pipefds[0], F_SETPIPE_SZ, pipe_sz);
+       if (ret < 0 && errno == EPERM)
+               SKIP(return, "insufficient pipe capacity");
+       ASSERT_GE(ret, pipe_sz);
 
        for (i = 0; i < MAX_FRAGS; i++)
                ASSERT_GE(vmsplice(pipefds[1], &sendchar_iov, 1, 0), 0);