From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from smtp.kernel.org (aws-us-west-2-korg-mail-1.web.codeaurora.org [10.30.226.201]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id C9C7F36683F for ; Tue, 10 Feb 2026 16:20:30 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=10.30.226.201 ARC-Seal:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1770740430; cv=none; b=o9592BDpsjo5Ak+rq5397pXfXQItJJrHApnZyoSljNC6FeswSOewBIi9Q/cWmydj0l8KUq7nWkzBjaHmj4yCDbxZwXVdxxfWvOTToqO0DUw2TRynmLFQJl3B2C/7mZgepgQLqP7WtG3XQQuD1enUFhWxeNeTH06SdoO/LfplLiA= ARC-Message-Signature:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1770740430; c=relaxed/simple; bh=NoQyPw0lEzEnufSLPO3aFeN0spY3kjiLTWeT8eyI96M=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=Q0Hy93BVqN69uZGXhOAsoYFzrzpSI0C0AIyAKXcngyBn2rN2mryBnd5ckcNCb1iEZJqkB7QN+a5QiE+P1E5YhLgrev3IlznEFzIZI4xeR9Cb90jxbT3GauY8t4vhf4JRUHRHHInBkNiq/zhpoGP6B43qP0W9f8m/v99XCrU4T8I= ARC-Authentication-Results:i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=n6V6iqqW; arc=none smtp.client-ip=10.30.226.201 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="n6V6iqqW" Received: by smtp.kernel.org (Postfix) with ESMTPSA id 0B147C19421; Tue, 10 Feb 2026 16:20:29 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1770740430; bh=NoQyPw0lEzEnufSLPO3aFeN0spY3kjiLTWeT8eyI96M=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=n6V6iqqW/Kx7AOLRe/CxBjWHT6XHHFmmFk96Z1E49DzoC3Wkma4XePPX2+k//dSdu iQW85CpEGwYISPkFiO/Iipc/kgBgkkJQ3B+WCRizTpncOzvrdTT0i1ZAjKjO+7c41F U/Yw6yEt3fsHt/KCQbml/5h65OzROAJklwD6IOOI8AZsQlR10ndN1Sp/6gh2tlhesb j/OX/vFgXjmcCf0/h67AaXNUr8viE7G++wsY9awd/w/Gr3dhP64do2PuMzMigf1Diz VQGZLdrnDBNVTALVJ5UwkSp7eAugsd5/V7t/ZMWWeAzp68ZdN6gRvuPlDeyzxfi2cj LeJCEdo5VEISQ== From: Chuck Lever To: NeilBrown , Jeff Layton , Olga Kornievskaia , Dai Ngo , Tom Talpey Cc: , Chuck Lever Subject: [PATCH v2 3/8] sunrpc: split svc_data_ready into protocol-specific callbacks Date: Tue, 10 Feb 2026 11:20:20 -0500 Message-ID: <20260210162025.2356389-4-cel@kernel.org> X-Mailer: git-send-email 2.52.0 In-Reply-To: <20260210162025.2356389-1-cel@kernel.org> References: <20260210162025.2356389-1-cel@kernel.org> Precedence: bulk X-Mailing-List: linux-nfs@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: 8bit From: Chuck Lever Separate data-ready callbacks enable protocol-specific optimizations. UDP and TCP transports already have different requirements: currently UDP sockets do not implement DTLS, so the XPT_HANDSHAKE check is unnecessary overhead for them. Prepare the server-side socket infrastructure for additional changes to TCP's data_ready callback. Signed-off-by: Chuck Lever --- include/trace/events/sunrpc.h | 3 ++- net/sunrpc/svcsock.c | 39 +++++++++++++++++++++++++++++------ 2 files changed, 35 insertions(+), 7 deletions(-) diff --git a/include/trace/events/sunrpc.h b/include/trace/events/sunrpc.h index 076182ae19ec..c5a15b7a321d 100644 --- a/include/trace/events/sunrpc.h +++ b/include/trace/events/sunrpc.h @@ -2313,7 +2313,8 @@ DEFINE_SVCSOCK_EVENT(tcp_send); DEFINE_SVCSOCK_EVENT(tcp_recv); DEFINE_SVCSOCK_EVENT(tcp_recv_eagain); DEFINE_SVCSOCK_EVENT(tcp_recv_err); -DEFINE_SVCSOCK_EVENT(data_ready); +DEFINE_SVCSOCK_EVENT(udp_data_ready); +DEFINE_SVCSOCK_EVENT(tcp_data_ready); DEFINE_SVCSOCK_EVENT(write_space); TRACE_EVENT(svcsock_tcp_recv_short, diff --git a/net/sunrpc/svcsock.c b/net/sunrpc/svcsock.c index d61cd9b40491..73644f3b63c7 100644 --- a/net/sunrpc/svcsock.c +++ b/net/sunrpc/svcsock.c @@ -397,10 +397,14 @@ static void svc_sock_secure_port(struct svc_rqst *rqstp) clear_bit(RQ_SECURE, &rqstp->rq_flags); } -/* - * INET callback when data has been received on the socket. +/** + * svc_udp_data_ready - sk->sk_data_ready callback for UDP sockets + * @sk: socket whose receive buffer contains data + * + * This implementation does not yet support DTLS, so the + * XPT_HANDSHAKE check is not needed here. */ -static void svc_data_ready(struct sock *sk) +static void svc_udp_data_ready(struct sock *sk) { struct svc_sock *svsk = (struct svc_sock *)sk->sk_user_data; @@ -410,7 +414,30 @@ static void svc_data_ready(struct sock *sk) /* Refer to svc_setup_socket() for details. */ rmb(); svsk->sk_odata(sk); - trace_svcsock_data_ready(&svsk->sk_xprt, 0); + trace_svcsock_udp_data_ready(&svsk->sk_xprt, 0); + if (!test_and_set_bit(XPT_DATA, &svsk->sk_xprt.xpt_flags)) + svc_xprt_enqueue(&svsk->sk_xprt); + } +} + +/** + * svc_tcp_data_ready - sk->sk_data_ready callback for TCP sockets + * @sk: socket whose receive buffer contains data + * + * Data ingest is skipped while a TLS handshake is in progress + * (XPT_HANDSHAKE). + */ +static void svc_tcp_data_ready(struct sock *sk) +{ + struct svc_sock *svsk = (struct svc_sock *)sk->sk_user_data; + + trace_sk_data_ready(sk); + + if (svsk) { + /* Refer to svc_setup_socket() for details. */ + rmb(); + svsk->sk_odata(sk); + trace_svcsock_tcp_data_ready(&svsk->sk_xprt, 0); if (test_bit(XPT_HANDSHAKE, &svsk->sk_xprt.xpt_flags)) return; if (!test_and_set_bit(XPT_DATA, &svsk->sk_xprt.xpt_flags)) @@ -835,7 +862,7 @@ static void svc_udp_init(struct svc_sock *svsk, struct svc_serv *serv) svc_xprt_init(sock_net(svsk->sk_sock->sk), &svc_udp_class, &svsk->sk_xprt, serv); clear_bit(XPT_CACHE_AUTH, &svsk->sk_xprt.xpt_flags); - svsk->sk_sk->sk_data_ready = svc_data_ready; + svsk->sk_sk->sk_data_ready = svc_udp_data_ready; svsk->sk_sk->sk_write_space = svc_write_space; /* initialise setting must have enough space to @@ -1368,7 +1395,7 @@ static void svc_tcp_init(struct svc_sock *svsk, struct svc_serv *serv) set_bit(XPT_CONN, &svsk->sk_xprt.xpt_flags); } else { sk->sk_state_change = svc_tcp_state_change; - sk->sk_data_ready = svc_data_ready; + sk->sk_data_ready = svc_tcp_data_ready; sk->sk_write_space = svc_write_space; svsk->sk_marker = xdr_zero; -- 2.52.0