Introduce a new sysctl knob, net.ipv4.tcp_purge_receive_queue, to address an unreleased SKBs issue related to TCP sockets.
Issue: When a TCP socket in the CLOSE_WAIT state receives a RST packet, the current implementation does not clear the socket's receive queue. This causes SKBs in the queue to remain allocated until the socket is explicitly closed by the application. As a consequence: 1. The page pool pages held by these SKBs are not released. 2. The associated page pool cannot be freed. RFC 9293 Section 3.10.7.4 specifies that when a RST is received in CLOSE_WAIT state, "all segment queues should be flushed." However, the current implementation does not flush the receive queue. Solution: Add a per-namespace sysctl (net.ipv4.tcp_purge_receive_queue) that, when enabled, causes the kernel to purge the receive queue when a RST packet is received in CLOSE_WAIT state. This allows immediate release of SKBs and their associated memory resources. The feature is disabled by default to maintain backward compatibility with existing behavior. Note: the user-space issue, the root cause of the unreleased SKBs, has been fixed by https://github.com/IBM/sarama/pull/3384. Changes: v1 -> v2: * Update 'tp->copied_seq', 'tp->urg_data', and 'sk->sk_peek_off' like 'tcp_disconnect()'. * Drop "memory leak" words in commit msg. (per Eric) * Add two packetdrill tests. (per Eric) * v1: https://lore.kernel.org/netdev/[email protected]/ Leon Hwang (2): tcp: Add net.ipv4.tcp_purge_receive_queue sysctl selftests/net: packetdrill: Add two tcp_purge_receive_queue tests Documentation/networking/ip-sysctl.rst | 18 ++++++++ .../net_cachelines/netns_ipv4_sysctl.rst | 1 + include/net/netns/ipv4.h | 1 + net/ipv4/sysctl_net_ipv4.c | 9 ++++ net/ipv4/tcp_input.c | 22 ++++++++++ .../tcp_purge_receive_queue_disabled.pkt | 40 ++++++++++++++++++ .../tcp_purge_receive_queue_enabled.pkt | 42 +++++++++++++++++++ 7 files changed, 133 insertions(+) create mode 100644 tools/testing/selftests/net/packetdrill/tcp_purge_receive_queue_disabled.pkt create mode 100644 tools/testing/selftests/net/packetdrill/tcp_purge_receive_queue_enabled.pkt -- 2.55.0

