[PATCH mptcp-next v6 07/10] mptcp: handle SO_ZEROCOPY in setsockopt
Geliang Tang <[email protected]> Thu, 16 Jul 2026 15:50:46 +0800
| Newsgroups | dev.linux.lists.mptcp |
|---|---|
| Message-ID | <1653984889e352b7f366f26a8fe4145cc94ddaa7.1784188064.git.tanggeliang@kylinos.cn> |
From: Geliang Tang <[email protected]> SO_ZEROCOPY is currently rejected by MPTCP setsockopt with -EOPNOTSUPP, even though the matching MSG_ZEROCOPY path in mptcp_sendmsg() is wired up. As a result MSG_ZEROCOPY silently falls back to a copy on MPTCP sockets because the opt-in flag is never set. Expose SO_ZEROCOPY through the SOL_SOCKET setsockopt dispatcher. The new mptcp_setsockopt_sol_socket_zerocopy() helper validates that val is 0 or 1 (matching standard TCP sk_setsockopt) and flips SOCK_ZEROCOPY on the msk only. mptcp_sendmsg() consults the same flag directly, so opt-in is honoured on every data path without any cross-socket propagation. Signed-off-by: Geliang Tang <[email protected]> --- net/mptcp/sockopt.c | 17 ++++++++++++++++- 1 file changed, 16 insertions(+), 1 deletion(-) diff --git a/net/mptcp/sockopt.c b/net/mptcp/sockopt.c index fcf6feb2a9eb..abcc7d4452b4 100644 --- a/net/mptcp/sockopt.c +++ b/net/mptcp/sockopt.c @@ -175,6 +175,19 @@ static int mptcp_setsockopt_sol_socket_tstamp(struct mptcp_sock *msk, int optnam return 0; } +static int mptcp_setsockopt_sol_socket_zerocopy(struct mptcp_sock *msk, int val) +{ + struct sock *sk = (struct sock *)msk; + + if (val != 0 && val != 1) + return -EINVAL; + + lock_sock(sk); + sock_valbool_flag(sk, SOCK_ZEROCOPY, val); + release_sock(sk); + return 0; +} + static int mptcp_setsockopt_sol_socket_int(struct mptcp_sock *msk, int optname, sockptr_t optval, unsigned int optlen) @@ -203,6 +216,8 @@ static int mptcp_setsockopt_sol_socket_int(struct mptcp_sock *msk, int optname, case SO_TIMESTAMPNS_OLD: case SO_TIMESTAMPNS_NEW: return mptcp_setsockopt_sol_socket_tstamp(msk, optname, val); + case SO_ZEROCOPY: + return mptcp_setsockopt_sol_socket_zerocopy(msk, val); } return -ENOPROTOOPT; @@ -342,6 +357,7 @@ static int mptcp_setsockopt_sol_socket(struct mptcp_sock *msk, int optname, case SO_TIMESTAMP_NEW: case SO_TIMESTAMPNS_OLD: case SO_TIMESTAMPNS_NEW: + case SO_ZEROCOPY: return mptcp_setsockopt_sol_socket_int(msk, optname, optval, optlen); case SO_TIMESTAMPING_OLD: @@ -387,7 +403,6 @@ static int mptcp_setsockopt_sol_socket(struct mptcp_sock *msk, int optname, * SO_CNX_ADVICE is currently unsupported, could possibly be relevant, * but likely needs careful design * - * SO_ZEROCOPY is currently unsupported, TODO in sndmsg * SO_TXTIME is currently unsupported */ -- 2.53.0