From 630e9bf1decf94618a036a020b7c920c8ab6126c Mon Sep 17 00:00:00 2001 From: David Gibson Date: Thu, 28 May 2026 15:02:06 +1000 Subject: tcp_splice: Remove never-invoked SO_RCVLOWAT logic tcp_splice_forward() contains some logic to use the SO_RCVLOWAT setsockopt(). This appears to be aimed at interrupt (epoll) mitigation, so that we're not always waking for a socket that's getting frequent small amounts of data. However, the logic is never invoked, and hasn't been since at least 2022_07_14.b86cd00: it's conditional on readlen > (long)c->tcp.pipe_size / 10 However, immediately before that we've invoked 'continue' if: readlen >= (long)c->tcp_pipe_size * 10 / 100 which is a strictly weaker condition. While it's possible we want to restore a working version of that interrupt mitigation at some point, for the time being this logic just confuses the picture and makes some other cleanups more awkward. We haven't had it for over 3 years, so it's clearly not vital. Signed-off-by: David Gibson Signed-off-by: Stefano Brivio --- tcp_splice.c | 22 +--------------------- 1 file changed, 1 insertion(+), 21 deletions(-) diff --git a/tcp_splice.c b/tcp_splice.c index 1f969a5..c066d68 100644 --- a/tcp_splice.c +++ b/tcp_splice.c @@ -530,28 +530,8 @@ retry: written, c->tcp.pipe_size); /* Most common case: skip updating count of pending bytes */ - if (readlen > 0 && readlen == written) { - if (readlen >= (long)c->tcp.pipe_size * 10 / 100) - continue; - - if (!(conn->flags & lowat_set_flag) && - readlen > (long)c->tcp.pipe_size / 10) { - int lowat = c->tcp.pipe_size / 4; - - if (setsockopt(conn->s[fromsidei], SOL_SOCKET, - SO_RCVLOWAT, - &lowat, sizeof(lowat))) { - flow_trace(conn, - "Setting SO_RCVLOWAT %i: %s", - lowat, strerror_(errno)); - } else { - conn_flag(conn, lowat_set_flag); - conn_flag(conn, lowat_act_flag); - } - } - + if (readlen > 0 && readlen == written) continue; - } conn->pending[fromsidei] += readlen > 0 ? readlen : 0; conn->pending[fromsidei] -= written > 0 ? written : 0; -- cgit v1.2.3