Re: [PATCH net-next] selftests: tls: size splice_short pipe by page size

From: Simon Horman

Date: Wed Jun 24 2026 - 08:52:01 EST


On Mon, Jun 22, 2026 at 01:28:47PM -0700, Nirmoy Das wrote:
> 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")
> Assisted-by: Codex:gpt-5
> Signed-off-by: Nirmoy Das <nirmoyd@xxxxxxxxxx>

The nit below not withstanding, this looks good to me.

Reviewed-by: Simon Horman <horms@xxxxxxxxxx>

> ---
> tools/testing/selftests/net/tls.c | 9 ++++++++-
> 1 file changed, 8 insertions(+), 1 deletion(-)
>
> diff --git a/tools/testing/selftests/net/tls.c b/tools/testing/selftests/net/tls.c
> index 30a236b8e9f73..e3bf4ade0f770 100644
> --- a/tools/testing/selftests/net/tls.c
> +++ b/tools/testing/selftests/net/tls.c
> @@ -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,12 @@ 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, 0);

nit: the line above seems redundant to me given the line below.

> + ASSERT_GE(ret, pipe_sz);
>
> for (i = 0; i < MAX_FRAGS; i++)
> ASSERT_GE(vmsplice(pipefds[1], &sendchar_iov, 1, 0), 0);
> --
> 2.43.0
>