From nobody Sat Jul 25 07:27:01 2026 Received: from out-186.mta0.migadu.com (out-186.mta0.migadu.com [91.218.175.186]) (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 5279133689D for ; Tue, 21 Jul 2026 02:41:16 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=91.218.175.186 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1784601677; cv=none; b=pcp+KSugwO6XuoAdv7OZg73nvweWARYsDGJ/B1Q1wsgYT9JvyiLsuxNfkCwjb/zPlMeqqFfL+1w2FwrsJ3RLgTtKtd0Q5Es9ci4C4MEO3elLJdjQTP1NwvUoMSuJ9hms+Hz9Zgbg6fWjD7K17WC4oqpuUcUQhQu+naWq6rbWCZY= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1784601677; c=relaxed/simple; bh=6wfibqnOLMR0ktaIFslCHrqRHEi2i1YDEreYu2sdh2Q=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=heiB60sDgjxGeF9eQBqXGLhSgXYUg2EnVwNeQPmK2U8bce5pJ988f/HuoR/OFgczbHJVhtKNNTLetT85gno8Ew2Zcc8r2MS0cCLvmyZwpysLJNwYBaac9AC2k+y6mEtJeHs8ZiWGm84e5Tz/nd0xg/c+SkuxUznIABDKEQpePJA= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=linux.dev; spf=pass smtp.mailfrom=linux.dev; dkim=pass (1024-bit key) header.d=linux.dev header.i=@linux.dev header.b=bSfFphDR; arc=none smtp.client-ip=91.218.175.186 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=linux.dev Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=linux.dev Authentication-Results: smtp.subspace.kernel.org; dkim=pass (1024-bit key) header.d=linux.dev header.i=@linux.dev header.b="bSfFphDR" X-Report-Abuse: Please report any abuse attempt to abuse@migadu.com and include these headers. DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linux.dev; s=key1; t=1784601674; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=yPSgShtA3PN6HuXQ+teAnK39RMaNZU94aTpzP6J8sm8=; b=bSfFphDRoD4zmLon1Z6HYlggmo2iOJjtCCU+BdpAbY7FmWFsuyQAtHqL0EYGd/iqdXdyEk Hg+oBZv5m78eT18/K4CEeua31/Qa/Kk4MNo13YEIJ5ILheCpvN3J+LiNKwuxaAnp3s/HgO Lxh4006D7JwKNPrByzQU0v8zSSK3/MM= From: Gang Yan To: mptcp@lists.linux.dev Cc: pabeni@redhat.com, Gang Yan Subject: [PATCH mptcp-next v2 1/7] mptcp: drop unused @max arg of __mptcp_setsockopt_set_val Date: Tue, 21 Jul 2026 10:40:56 +0800 Message-ID: In-Reply-To: References: Precedence: bulk X-Mailing-List: mptcp@lists.linux.dev List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-Migadu-Flow: FLOW_OUT Content-Type: text/plain; charset="utf-8" From: Gang Yan The @max argument is never read in the function body. Remove it and the MAX_TCP_KEEP* values passed by the TCP_KEEPIDLE/INTVL/KEEPCNT callers. Signed-off-by: Gang Yan --- net/mptcp/sockopt.c | 11 ++++------- 1 file changed, 4 insertions(+), 7 deletions(-) diff --git a/net/mptcp/sockopt.c b/net/mptcp/sockopt.c index fcf6feb2a9eb..9c4faa0d82ef 100644 --- a/net/mptcp/sockopt.c +++ b/net/mptcp/sockopt.c @@ -632,7 +632,7 @@ static int mptcp_setsockopt_sol_tcp_congestion(struct m= ptcp_sock *msk, sockptr_t return ret; } =20 -static int __mptcp_setsockopt_set_val(struct mptcp_sock *msk, int max, +static int __mptcp_setsockopt_set_val(struct mptcp_sock *msk, int (*set_val)(struct sock *, int), int *msk_val, int val) { @@ -876,18 +876,15 @@ static int mptcp_setsockopt_sol_tcp(struct mptcp_sock= *msk, int optname, ret =3D __mptcp_setsockopt_sol_tcp_nodelay(msk, val); break; case TCP_KEEPIDLE: - ret =3D __mptcp_setsockopt_set_val(msk, MAX_TCP_KEEPIDLE, - &tcp_sock_set_keepidle_locked, + ret =3D __mptcp_setsockopt_set_val(msk, &tcp_sock_set_keepidle_locked, &msk->keepalive_idle, val); break; case TCP_KEEPINTVL: - ret =3D __mptcp_setsockopt_set_val(msk, MAX_TCP_KEEPINTVL, - &tcp_sock_set_keepintvl, + ret =3D __mptcp_setsockopt_set_val(msk, &tcp_sock_set_keepintvl, &msk->keepalive_intvl, val); break; case TCP_KEEPCNT: - ret =3D __mptcp_setsockopt_set_val(msk, MAX_TCP_KEEPCNT, - &tcp_sock_set_keepcnt, + ret =3D __mptcp_setsockopt_set_val(msk, &tcp_sock_set_keepcnt, &msk->keepalive_cnt, val); break; --=20 2.43.0 From nobody Sat Jul 25 07:27:01 2026 Received: from out-181.mta0.migadu.com (out-181.mta0.migadu.com [91.218.175.181]) (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 34D0333689D for ; Tue, 21 Jul 2026 02:41:19 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=91.218.175.181 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1784601680; cv=none; b=Kxxa3/ofj3OaGZRhgGuy/rwoV96RuMxDkxIoxxyRMu5fMMEDG14EQkUAZd2dG43zuITr+68HbShNIcX65WXFuXuWjyI+wzkuSPD1w4lWVecHiLCaimEbWijG6h2PD0PsegY4FMBb3ONiMOQu2BuQ84rvx3PzbMrtwVANyT6oYGM= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1784601680; c=relaxed/simple; bh=6OzbjMu3kU+VXVmKHEHfXbxjpGlXUd2yuZXVPmkKTRw=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=AwiAGqjcEjPabR26U1sIo9nL+ojoYwGaNsNEoTvdn49KgWe1m9kuit4A2dop1nSL1b2hiTrcUvMcHh2iOELHllaQ3ad2bsS1M1iSB76gJgV+STxptIVwLvjBiME3YE9FWr/gA/pgsPkQ4M6Oi4KUFPqnJ2yEhTM1QH0/kFLnPto= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=linux.dev; spf=pass smtp.mailfrom=linux.dev; dkim=pass (1024-bit key) header.d=linux.dev header.i=@linux.dev header.b=oIM/Pe5V; arc=none smtp.client-ip=91.218.175.181 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=linux.dev Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=linux.dev Authentication-Results: smtp.subspace.kernel.org; dkim=pass (1024-bit key) header.d=linux.dev header.i=@linux.dev header.b="oIM/Pe5V" X-Report-Abuse: Please report any abuse attempt to abuse@migadu.com and include these headers. DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linux.dev; s=key1; t=1784601677; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=WAPvGHNVb9dxiFeuE9XdX0m1Z95/0PNHtFQ+ykI01nE=; b=oIM/Pe5VQTehLAv8w9BnsuekBPxoRuSWUeufTgThhZhyJe/4n2DTRu4TavNj/3zyiurueE ry+prdAzyEMGoFGlUGIn8W2tMibNT8SVG8266C3L0NtBhflwkZjnMLUecGHAssigsnstOp gm4OASshVu3+5VFTiBEJTuneROwT7FE= From: Gang Yan To: mptcp@lists.linux.dev Cc: pabeni@redhat.com, Gang Yan Subject: [PATCH mptcp-next v2 2/7] mptcp: take TCP_MAXSEG handling into __mptcp_setsockopt_set_val Date: Tue, 21 Jul 2026 10:40:57 +0800 Message-ID: <11304a8f1ec63390553390404d9164f7a4213b79.1784601268.git.yangang@kylinos.cn> In-Reply-To: References: Precedence: bulk X-Mailing-List: mptcp@lists.linux.dev List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-Migadu-Flow: FLOW_OUT Content-Type: text/plain; charset="utf-8" From: Gang Yan mptcp_setsockopt_all_sf is only used in 'TCP_MAXSEG', and it can be replaced with __mptcp_setsockopt_set_val. Signed-off-by: Gang Yan --- net/ipv4/tcp.c | 1 + net/mptcp/sockopt.c | 27 ++------------------------- 2 files changed, 3 insertions(+), 25 deletions(-) diff --git a/net/ipv4/tcp.c b/net/ipv4/tcp.c index b427f924608c..5915d0e62f43 100644 --- a/net/ipv4/tcp.c +++ b/net/ipv4/tcp.c @@ -3830,6 +3830,7 @@ int tcp_sock_set_maxseg(struct sock *sk, int val) WRITE_ONCE(tcp_sk(sk)->rx_opt.user_mss, val); return 0; } +EXPORT_SYMBOL(tcp_sock_set_maxseg); =20 /* * Socket option code for TCP. diff --git a/net/mptcp/sockopt.c b/net/mptcp/sockopt.c index 9c4faa0d82ef..3e000436ab94 100644 --- a/net/mptcp/sockopt.c +++ b/net/mptcp/sockopt.c @@ -808,28 +808,6 @@ static int mptcp_setsockopt_first_sf_only(struct mptcp= _sock *msk, int level, int return ret; } =20 -static int mptcp_setsockopt_all_sf(struct mptcp_sock *msk, int level, - int optname, sockptr_t optval, - unsigned int optlen) -{ - struct mptcp_subflow_context *subflow; - int ret =3D 0; - - mptcp_for_each_subflow(msk, subflow) { - struct sock *ssk =3D mptcp_subflow_tcp_sock(subflow); - int err; - - err =3D tcp_setsockopt(ssk, level, optname, optval, optlen); - if (err < 0 && ret =3D=3D 0) - ret =3D err; - } - - if (!ret) - sockopt_seq_inc(msk); - - return ret; -} - static int mptcp_setsockopt_sol_tcp(struct mptcp_sock *msk, int optname, sockptr_t optval, unsigned int optlen) { @@ -889,9 +867,8 @@ static int mptcp_setsockopt_sol_tcp(struct mptcp_sock *= msk, int optname, val); break; case TCP_MAXSEG: - msk->maxseg =3D val; - ret =3D mptcp_setsockopt_all_sf(msk, SOL_TCP, optname, optval, - optlen); + ret =3D __mptcp_setsockopt_set_val(msk, &tcp_sock_set_maxseg, + &msk->maxseg, val); break; default: ret =3D -ENOPROTOOPT; --=20 2.43.0 From nobody Sat Jul 25 07:27:01 2026 Received: from out-172.mta0.migadu.com (out-172.mta0.migadu.com [91.218.175.172]) (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 76D4A33689D for ; Tue, 21 Jul 2026 02:41:22 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=91.218.175.172 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1784601684; cv=none; b=WFmBLQOw7YMlXEP8ikP+gmTO1qC53aOklA18S0S51RcfK/aH8PA8vDe9kHnk6FHd0LQuld+YNzq64uZz/fwTndnFmi7tXgHzShOk7s9nsEJvhxkNc6820R6KhrPaFk9SU+6WGhujBXib9lKFokTF3eM1b8f+S4Ng3AD6+KPQ7Ng= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1784601684; c=relaxed/simple; bh=lSrRZ3Y+nM43rz3WmrNqGQwF2HYHqh+37LyQpMNAcZw=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=ANJAXcley58bvuvbMnxGf8S5Y581NAKpXFkuDwSl9t3Tr4Yr+y4Os8f132rxOs0uIr8Ih6zheN/jAQQ8roifsb1IKPC2Un2zuXCB8/R2llji8PYY4DIIUkbJQha8P8Xt/dkiTCg8flYeJgvn7U9Wmyl0fz3XqT+p7naE7MMILIg= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=linux.dev; spf=pass smtp.mailfrom=linux.dev; dkim=pass (1024-bit key) header.d=linux.dev header.i=@linux.dev header.b=j0t+YldB; arc=none smtp.client-ip=91.218.175.172 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=linux.dev Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=linux.dev Authentication-Results: smtp.subspace.kernel.org; dkim=pass (1024-bit key) header.d=linux.dev header.i=@linux.dev header.b="j0t+YldB" X-Report-Abuse: Please report any abuse attempt to abuse@migadu.com and include these headers. DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linux.dev; s=key1; t=1784601680; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=CBjDbQ6PjDkbugvRSiNhCTFinoGxGoujBfTC7JIajoI=; b=j0t+YldBUs5BCNkwsIj5b32NLOTVT+8Zmuq6Kdedoy5s8o9AhmPdkkaeAACg5DrufJpwFb 8szMo9pHugjUiduWFWJ/mKa4tdJbwh/tKvU6Y+hpChgbKmcYO63Xuh5TPK8sBc8fscMlTC TJGAEPp0jX6JmtjIgfFfhaoWKOGuzus= From: Gang Yan To: mptcp@lists.linux.dev Cc: pabeni@redhat.com, Gang Yan Subject: [PATCH mptcp-next v2 3/7] mptcp: use sockopt_lock/release_sock in sockopt Date: Tue, 21 Jul 2026 10:40:58 +0800 Message-ID: In-Reply-To: References: Precedence: bulk X-Mailing-List: mptcp@lists.linux.dev List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-Migadu-Flow: FLOW_OUT Content-Type: text/plain; charset="utf-8" From: Gang Yan TCP and the core socket layer use sockopt_lock_sock() / sockopt_release_sock() in their setsockopt and getsockopt handlers. Switch the MPTCP socket (msk) level lock_sock()/release_sock() calls to use the BPF-aware wrappers, making the MPTCP sockopt codepaths consistent with the rest of the networking stack. Signed-off-by: Gang Yan --- net/mptcp/sockopt.c | 84 ++++++++++++++++++++++----------------------- 1 file changed, 42 insertions(+), 42 deletions(-) diff --git a/net/mptcp/sockopt.c b/net/mptcp/sockopt.c index 3e000436ab94..1665438269e5 100644 --- a/net/mptcp/sockopt.c +++ b/net/mptcp/sockopt.c @@ -78,7 +78,7 @@ static void mptcp_sol_socket_sync_intval(struct mptcp_soc= k *msk, int optname, in struct mptcp_subflow_context *subflow; struct sock *sk =3D (struct sock *)msk; =20 - lock_sock(sk); + sockopt_lock_sock(sk); sockopt_seq_inc(msk); =20 mptcp_for_each_subflow(msk, subflow) { @@ -123,7 +123,7 @@ static void mptcp_sol_socket_sync_intval(struct mptcp_s= ock *msk, int optname, in unlock_sock_fast(ssk, slow); } =20 - release_sock(sk); + sockopt_release_sock(sk); } =20 static int mptcp_sol_socket_intval(struct mptcp_sock *msk, int optname, in= t val) @@ -162,7 +162,7 @@ static int mptcp_setsockopt_sol_socket_tstamp(struct mp= tcp_sock *msk, int optnam if (ret) return ret; =20 - lock_sock(sk); + sockopt_lock_sock(sk); mptcp_for_each_subflow(msk, subflow) { struct sock *ssk =3D mptcp_subflow_tcp_sock(subflow); =20 @@ -171,7 +171,7 @@ static int mptcp_setsockopt_sol_socket_tstamp(struct mp= tcp_sock *msk, int optnam release_sock(ssk); } =20 - release_sock(sk); + sockopt_release_sock(sk); return 0; } =20 @@ -237,7 +237,7 @@ static int mptcp_setsockopt_sol_socket_timestamping(str= uct mptcp_sock *msk, if (ret) return ret; =20 - lock_sock(sk); + sockopt_lock_sock(sk); =20 mptcp_for_each_subflow(msk, subflow) { struct sock *ssk =3D mptcp_subflow_tcp_sock(subflow); @@ -251,7 +251,7 @@ static int mptcp_setsockopt_sol_socket_timestamping(str= uct mptcp_sock *msk, ret =3D err; } =20 - release_sock(sk); + sockopt_release_sock(sk); =20 return ret; } @@ -276,7 +276,7 @@ static int mptcp_setsockopt_sol_socket_linger(struct mp= tcp_sock *msk, sockptr_t if (ret) return ret; =20 - lock_sock(sk); + sockopt_lock_sock(sk); sockopt_seq_inc(msk); mptcp_for_each_subflow(msk, subflow) { struct sock *ssk =3D mptcp_subflow_tcp_sock(subflow); @@ -293,7 +293,7 @@ static int mptcp_setsockopt_sol_socket_linger(struct mp= tcp_sock *msk, sockptr_t unlock_sock_fast(ssk, slow); } =20 - release_sock(sk); + sockopt_release_sock(sk); return 0; } =20 @@ -309,10 +309,10 @@ static int mptcp_setsockopt_sol_socket(struct mptcp_s= ock *msk, int optname, case SO_REUSEADDR: case SO_BINDTODEVICE: case SO_BINDTOIFINDEX: - lock_sock(sk); + sockopt_lock_sock(sk); ssk =3D __mptcp_nmpc_sk(msk); if (IS_ERR(ssk)) { - release_sock(sk); + sockopt_release_sock(sk); return PTR_ERR(ssk); } =20 @@ -327,7 +327,7 @@ static int mptcp_setsockopt_sol_socket(struct mptcp_soc= k *msk, int optname, else if (optname =3D=3D SO_BINDTOIFINDEX) sk->sk_bound_dev_if =3D ssk->sk_bound_dev_if; } - release_sock(sk); + sockopt_release_sock(sk); return ret; case SO_KEEPALIVE: case SO_PRIORITY: @@ -405,16 +405,16 @@ static int mptcp_setsockopt_v6(struct mptcp_sock *msk= , int optname, case IPV6_V6ONLY: case IPV6_TRANSPARENT: case IPV6_FREEBIND: - lock_sock(sk); + sockopt_lock_sock(sk); ssk =3D __mptcp_nmpc_sk(msk); if (IS_ERR(ssk)) { - release_sock(sk); + sockopt_release_sock(sk); return PTR_ERR(ssk); } =20 ret =3D tcp_setsockopt(ssk, SOL_IPV6, optname, optval, optlen); if (ret !=3D 0) { - release_sock(sk); + sockopt_release_sock(sk); return ret; } =20 @@ -434,7 +434,7 @@ static int mptcp_setsockopt_v6(struct mptcp_sock *msk, = int optname, break; } =20 - release_sock(sk); + sockopt_release_sock(sk); break; } =20 @@ -611,7 +611,7 @@ static int mptcp_setsockopt_sol_tcp_congestion(struct m= ptcp_sock *msk, sockptr_t cap_net_admin =3D ns_capable(sock_net(sk)->user_ns, CAP_NET_ADMIN); =20 ret =3D 0; - lock_sock(sk); + sockopt_lock_sock(sk); sockopt_seq_inc(msk); mptcp_for_each_subflow(msk, subflow) { struct sock *ssk =3D mptcp_subflow_tcp_sock(subflow); @@ -628,7 +628,7 @@ static int mptcp_setsockopt_sol_tcp_congestion(struct m= ptcp_sock *msk, sockptr_t if (ret =3D=3D 0) strscpy(msk->ca_name, name, sizeof(msk->ca_name)); =20 - release_sock(sk); + sockopt_release_sock(sk); return ret; } =20 @@ -707,11 +707,11 @@ static int mptcp_setsockopt_sol_ip_set(struct mptcp_s= ock *msk, int optname, if (err !=3D 0) return err; =20 - lock_sock(sk); + sockopt_lock_sock(sk); =20 ssk =3D __mptcp_nmpc_sk(msk); if (IS_ERR(ssk)) { - release_sock(sk); + sockopt_release_sock(sk); return PTR_ERR(ssk); } =20 @@ -732,13 +732,13 @@ static int mptcp_setsockopt_sol_ip_set(struct mptcp_s= ock *msk, int optname, READ_ONCE(inet_sk(sk)->local_port_range)); break; default: - release_sock(sk); + sockopt_release_sock(sk); WARN_ON_ONCE(1); return -EOPNOTSUPP; } =20 sockopt_seq_inc(msk); - release_sock(sk); + sockopt_release_sock(sk); return 0; } =20 @@ -754,7 +754,7 @@ static int mptcp_setsockopt_v4_set_tos(struct mptcp_soc= k *msk, int optname, if (err !=3D 0) return err; =20 - lock_sock(sk); + sockopt_lock_sock(sk); sockopt_seq_inc(msk); val =3D READ_ONCE(inet_sk(sk)->tos); mptcp_for_each_subflow(msk, subflow) { @@ -765,7 +765,7 @@ static int mptcp_setsockopt_v4_set_tos(struct mptcp_soc= k *msk, int optname, __ip_sock_set_tos(ssk, val); unlock_sock_fast(ssk, slow); } - release_sock(sk); + sockopt_release_sock(sk); =20 return 0; } @@ -794,7 +794,7 @@ static int mptcp_setsockopt_first_sf_only(struct mptcp_= sock *msk, int level, int int ret; =20 /* Limit to first subflow, before the connection establishment */ - lock_sock(sk); + sockopt_lock_sock(sk); ssk =3D __mptcp_nmpc_sk(msk); if (IS_ERR(ssk)) { ret =3D PTR_ERR(ssk); @@ -804,7 +804,7 @@ static int mptcp_setsockopt_first_sf_only(struct mptcp_= sock *msk, int level, int ret =3D tcp_setsockopt(ssk, level, optname, optval, optlen); =20 unlock: - release_sock(sk); + sockopt_release_sock(sk); return ret; } =20 @@ -835,7 +835,7 @@ static int mptcp_setsockopt_sol_tcp(struct mptcp_sock *= msk, int optname, if (ret) return ret; =20 - lock_sock(sk); + sockopt_lock_sock(sk); switch (optname) { case TCP_INQ: if (val < 0 || val > 1) @@ -874,7 +874,7 @@ static int mptcp_setsockopt_sol_tcp(struct mptcp_sock *= msk, int optname, ret =3D -ENOPROTOOPT; } =20 - release_sock(sk); + sockopt_release_sock(sk); return ret; } =20 @@ -898,9 +898,9 @@ int mptcp_setsockopt(struct sock *sk, int level, int op= tname, * is in TCP fallback, when TCP socket options are passed through * to the one remaining subflow. */ - lock_sock(sk); + sockopt_lock_sock(sk); ssk =3D __mptcp_tcp_fallback(msk); - release_sock(sk); + sockopt_release_sock(sk); if (ssk) return tcp_setsockopt(ssk, level, optname, optval, optlen); =20 @@ -923,7 +923,7 @@ static int mptcp_getsockopt_first_sf_only(struct mptcp_= sock *msk, int level, int struct sock *ssk; int ret; =20 - lock_sock(sk); + sockopt_lock_sock(sk); ssk =3D msk->first; if (ssk) goto get; @@ -938,7 +938,7 @@ static int mptcp_getsockopt_first_sf_only(struct mptcp_= sock *msk, int level, int ret =3D tcp_getsockopt(ssk, level, optname, optval, optlen); =20 out: - release_sock(sk); + sockopt_release_sock(sk); return ret; } =20 @@ -1109,7 +1109,7 @@ static int mptcp_getsockopt_tcpinfo(struct mptcp_sock= *msk, char __user *optval, =20 infoptr =3D optval + sfd.size_subflow_data; =20 - lock_sock(sk); + sockopt_lock_sock(sk); =20 mptcp_for_each_subflow(msk, subflow) { struct sock *ssk =3D mptcp_subflow_tcp_sock(subflow); @@ -1122,7 +1122,7 @@ static int mptcp_getsockopt_tcpinfo(struct mptcp_sock= *msk, char __user *optval, tcp_get_info(ssk, &info); =20 if (copy_to_user(infoptr, &info, sfd.size_user)) { - release_sock(sk); + sockopt_release_sock(sk); return -EFAULT; } =20 @@ -1132,7 +1132,7 @@ static int mptcp_getsockopt_tcpinfo(struct mptcp_sock= *msk, char __user *optval, } } =20 - release_sock(sk); + sockopt_release_sock(sk); =20 sfd.num_subflows =3D sfcount; =20 @@ -1201,7 +1201,7 @@ static int mptcp_getsockopt_subflow_addrs(struct mptc= p_sock *msk, char __user *o =20 addrptr =3D optval + sfd.size_subflow_data; =20 - lock_sock(sk); + sockopt_lock_sock(sk); =20 mptcp_for_each_subflow(msk, subflow) { struct sock *ssk =3D mptcp_subflow_tcp_sock(subflow); @@ -1214,7 +1214,7 @@ static int mptcp_getsockopt_subflow_addrs(struct mptc= p_sock *msk, char __user *o mptcp_get_sub_addrs(ssk, &a); =20 if (copy_to_user(addrptr, &a, sfd.size_user)) { - release_sock(sk); + sockopt_release_sock(sk); return -EFAULT; } =20 @@ -1224,7 +1224,7 @@ static int mptcp_getsockopt_subflow_addrs(struct mptc= p_sock *msk, char __user *o } } =20 - release_sock(sk); + sockopt_release_sock(sk); =20 sfd.num_subflows =3D sfcount; =20 @@ -1310,7 +1310,7 @@ static int mptcp_getsockopt_full_info(struct mptcp_so= ck *msk, char __user *optva sizeof(struct mptcp_subflow_info)); tcpinfoptr =3D u64_to_user_ptr(mfi.tcp_info); =20 - lock_sock(sk); + sockopt_lock_sock(sk); mptcp_for_each_subflow(msk, subflow) { struct sock *ssk =3D mptcp_subflow_tcp_sock(subflow); struct mptcp_subflow_info sfinfo; @@ -1340,7 +1340,7 @@ static int mptcp_getsockopt_full_info(struct mptcp_so= ck *msk, char __user *optva tcpinfoptr +=3D mfi.size_tcpinfo_user; sfinfoptr +=3D mfi.size_sfinfo_user; } - release_sock(sk); + sockopt_release_sock(sk); =20 mfi.num_subflows =3D sfcount; if (mptcp_put_full_info(&mfi, optval, copylen, optlen)) @@ -1349,7 +1349,7 @@ static int mptcp_getsockopt_full_info(struct mptcp_so= ck *msk, char __user *optva return 0; =20 fail_release: - release_sock(sk); + sockopt_release_sock(sk); return -EFAULT; } =20 @@ -1504,9 +1504,9 @@ int mptcp_getsockopt(struct sock *sk, int level, int = optname, * is in TCP fallback, when socket options are passed through * to the one remaining subflow. */ - lock_sock(sk); + sockopt_lock_sock(sk); ssk =3D __mptcp_tcp_fallback(msk); - release_sock(sk); + sockopt_release_sock(sk); if (ssk) return tcp_getsockopt(ssk, level, optname, optval, option); =20 --=20 2.43.0 From nobody Sat Jul 25 07:27:01 2026 Received: from out-177.mta0.migadu.com (out-177.mta0.migadu.com [91.218.175.177]) (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 5F23A33689D for ; Tue, 21 Jul 2026 02:41:26 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=91.218.175.177 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1784601687; cv=none; b=Ry5GwiPiSAh3vDgeC6qvmFydjoLcybH3nKV6MfpNijBS57BRC1HiLGS6b//9etglwldY3UOD+GGMouExmjmd7ZYy8qyVxfwCaRccXEyp8whmgqGQzuZlwJJpKTYj1+bp09Ca49DwxvTHExIxpbuuPb+iR/Ll5AnDrNZoRGDMfZA= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1784601687; c=relaxed/simple; bh=tGrff5MVv3in504xy/juPPPKg4F38UakVfYLlJPCyf0=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=fCd0spKw9cK5bXKf5+yoeBvqvBuolQ1UzkTyKoZ3ZpOelJELKXAFKQ7lZ2JJEUXRlNTOpPzeMakFLCLZ8lWKw1/Hac0m1gK5DsGPB2tFq/7WIL3UZt9fvxMh43/6GlJiN3/45jiCqW1CBIYXdkQRyTMhAlf6hd67sWma9gCL5as= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=linux.dev; spf=pass smtp.mailfrom=linux.dev; dkim=pass (1024-bit key) header.d=linux.dev header.i=@linux.dev header.b=qAZrBtqb; arc=none smtp.client-ip=91.218.175.177 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=linux.dev Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=linux.dev Authentication-Results: smtp.subspace.kernel.org; dkim=pass (1024-bit key) header.d=linux.dev header.i=@linux.dev header.b="qAZrBtqb" X-Report-Abuse: Please report any abuse attempt to abuse@migadu.com and include these headers. DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linux.dev; s=key1; t=1784601684; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=ixpkjtUO7RJBzXA9hxDfneNdqCBs+/C3Oz2Di+vOov0=; b=qAZrBtqbN3isLRDNVzT5gLXSqZS//eOvp9f8eqtlgjxft/HcWQelJc7A2c2hga9y5lR29I XjMvDh5vYBrDuvZ4diwzhF84N69kQJ8GZDmSHG3KX/eN5hCBsO6HSg4OOCHHExKQMzA4kk 0WKEr0aFiSrBI+TS+39HBtUr1qnGywY= From: Gang Yan To: mptcp@lists.linux.dev Cc: pabeni@redhat.com, Gang Yan Subject: [PATCH mptcp-next v2 4/7] mptcp: reject sockopt requiring ssks' lock in BPF context Date: Tue, 21 Jul 2026 10:40:59 +0800 Message-ID: <4a9a4167599802c1d22d2254c789c491c74a828e.1784601268.git.yangang@kylinos.cn> In-Reply-To: References: Precedence: bulk X-Mailing-List: mptcp@lists.linux.dev List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-Migadu-Flow: FLOW_OUT Content-Type: text/plain; charset="utf-8" From: Gang Yan Several MPTCP setsockopt handlers need to acquire the subflow lock via lock_sock(ssk) to propagate settings to each subflow. This lock can sleep and is therefore not usable in BPF context where sleeping is forbidden. The short-term solution is to make any sockopt operation that requires subflow-level lock fail with -EOPNOTSUPP when called from BPF context. Signed-off-by: Gang Yan --- net/mptcp/sockopt.c | 27 +++++++++++++++++++++++++++ 1 file changed, 27 insertions(+) diff --git a/net/mptcp/sockopt.c b/net/mptcp/sockopt.c index 1665438269e5..195f9ca342fb 100644 --- a/net/mptcp/sockopt.c +++ b/net/mptcp/sockopt.c @@ -185,6 +185,9 @@ static int mptcp_setsockopt_sol_socket_int(struct mptcp= _sock *msk, int optname, if (ret) return ret; =20 + if (has_current_bpf_ctx()) + return -EOPNOTSUPP; + switch (optname) { case SO_KEEPALIVE: case SO_DEBUG: @@ -218,6 +221,9 @@ static int mptcp_setsockopt_sol_socket_timestamping(str= uct mptcp_sock *msk, struct so_timestamping timestamping; int ret; =20 + if (has_current_bpf_ctx()) + return -EOPNOTSUPP; + if (optlen =3D=3D sizeof(timestamping)) { if (copy_from_sockptr(×tamping, optval, sizeof(timestamping))) @@ -265,6 +271,9 @@ static int mptcp_setsockopt_sol_socket_linger(struct mp= tcp_sock *msk, sockptr_t sockptr_t kopt; int ret; =20 + if (has_current_bpf_ctx()) + return -EOPNOTSUPP; + if (optlen < sizeof(ling)) return -EINVAL; =20 @@ -598,6 +607,9 @@ static int mptcp_setsockopt_sol_tcp_congestion(struct m= ptcp_sock *msk, sockptr_t bool cap_net_admin; int ret; =20 + if (has_current_bpf_ctx()) + return -EOPNOTSUPP; + if (optlen < 1) return -EINVAL; =20 @@ -639,6 +651,9 @@ static int __mptcp_setsockopt_set_val(struct mptcp_sock= *msk, struct mptcp_subflow_context *subflow; int err =3D 0; =20 + if (has_current_bpf_ctx()) + return -EOPNOTSUPP; + mptcp_for_each_subflow(msk, subflow) { struct sock *ssk =3D mptcp_subflow_tcp_sock(subflow); int ret; @@ -662,6 +677,9 @@ static int __mptcp_setsockopt_sol_tcp_cork(struct mptcp= _sock *msk, int val) struct mptcp_subflow_context *subflow; struct sock *sk =3D (struct sock *)msk; =20 + if (has_current_bpf_ctx()) + return -EOPNOTSUPP; + sockopt_seq_inc(msk); msk->cork =3D !!val; mptcp_for_each_subflow(msk, subflow) { @@ -682,6 +700,9 @@ static int __mptcp_setsockopt_sol_tcp_nodelay(struct mp= tcp_sock *msk, int val) struct mptcp_subflow_context *subflow; struct sock *sk =3D (struct sock *)msk; =20 + if (has_current_bpf_ctx()) + return -EOPNOTSUPP; + sockopt_seq_inc(msk); msk->nodelay =3D !!val; mptcp_for_each_subflow(msk, subflow) { @@ -749,6 +770,9 @@ static int mptcp_setsockopt_v4_set_tos(struct mptcp_soc= k *msk, int optname, struct sock *sk =3D (struct sock *)msk; int err, val; =20 + if (has_current_bpf_ctx()) + return -EOPNOTSUPP; + err =3D ip_setsockopt(sk, SOL_IP, optname, optval, optlen); =20 if (err !=3D 0) @@ -1610,6 +1634,9 @@ int mptcp_set_rcvlowat(struct sock *sk, int val) if (sk->sk_protocol =3D=3D IPPROTO_TCP) return -EINVAL; =20 + if (has_current_bpf_ctx()) + return -EOPNOTSUPP; + if (sk->sk_userlocks & SOCK_RCVBUF_LOCK) cap =3D sk->sk_rcvbuf >> 1; else --=20 2.43.0 From nobody Sat Jul 25 07:27:01 2026 Received: from out-173.mta0.migadu.com (out-173.mta0.migadu.com [91.218.175.173]) (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 44C2F2D7393 for ; Tue, 21 Jul 2026 02:41:29 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=91.218.175.173 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1784601690; cv=none; b=im++6bThCTqqJq65VqBVF03BjRQdkPS/62RGiP10M/vvyhwb7bR0ZP1E5zcqoW5MILp9su0vB4/Hpp4bGvrYMMTm75aPajoInxlIeHhVRq6X9sRCiyggBmuvVdYGWszSdLNIlcd7ynJwT0YwtcvuH0EXOxb5n9bmvPWjqL6PkE8= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1784601690; c=relaxed/simple; bh=RwQ2ZyRTWdsJB94Xk5fSutnmDGpQxU3yZiJdz8aqBxY=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=KTLc1J0NfnAB3yvQjXbG4O0eeeETsb4Nu7Tzr/zZ4nmybkSQHW8kVCnbmX8CxQzO00n6BSAyOTSxZxCcD0SsUkMIhdH+GFwcnd/ThDImbb2hdSe8V8e5oqBib1CWLmfCgfcPkmWDH/wMDGESWZrQVbAsDswjZkXUCtNbxJYjp8Q= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=linux.dev; spf=pass smtp.mailfrom=linux.dev; dkim=pass (1024-bit key) header.d=linux.dev header.i=@linux.dev header.b=NqvinwdQ; arc=none smtp.client-ip=91.218.175.173 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=linux.dev Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=linux.dev Authentication-Results: smtp.subspace.kernel.org; dkim=pass (1024-bit key) header.d=linux.dev header.i=@linux.dev header.b="NqvinwdQ" X-Report-Abuse: Please report any abuse attempt to abuse@migadu.com and include these headers. DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linux.dev; s=key1; t=1784601687; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=G6fbaEFLyxJvO1MF8ueeaNjJuFg1qmrk1K1kPVzQdqo=; b=NqvinwdQPjZifXogK4DfensrEnkxXHAH0jO2y4f5dDyuVLuRJiQGPLLm3oiAPoLGB4xWVA EpkhYribNf3t02B6LEbUrd+2Y9qGH/pwX3lPqhpz9UeBKdSdMO0sXg31mTHx9l8O88ZBeH XCGigEFVJiGJqNyy0u3Nf2KChC9AVBk= From: Gang Yan To: mptcp@lists.linux.dev Cc: pabeni@redhat.com, Gang Yan Subject: [PATCH mptcp-next v2 5/7] mptcp: enable bpf_setsockopt on the master socket Date: Tue, 21 Jul 2026 10:41:00 +0800 Message-ID: <105cb65167ebbedb770760193e2af64dab4dbf10.1784601268.git.yangang@kylinos.cn> In-Reply-To: References: Precedence: bulk X-Mailing-List: mptcp@lists.linux.dev List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-Migadu-Flow: FLOW_OUT Content-Type: text/plain; charset="utf-8" From: Gang Yan bpf_setsockopt() currently cannot be used on mptcp master sockets: __bpf_setsockopt() dispatches by level to the protocol-agnostic sol_*_sockopt() helpers, which either reject the msk (sk_protocol =3D=3D IPPROTO_MPTCP) and the ssk (sk_is_tcp() is false) or bypass mptcp's own dispatch (e.g. SOL_IP going straight to do_ip_setsockopt()). This patch routes any level to mptcp_setsockopt(), which already handles all levels. Signed-off-by: Gang Yan --- include/net/mptcp.h | 9 +++++++++ net/core/filter.c | 7 +++++++ 2 files changed, 16 insertions(+) diff --git a/include/net/mptcp.h b/include/net/mptcp.h index 333bde2a0b76..fcce2b7e9ef9 100644 --- a/include/net/mptcp.h +++ b/include/net/mptcp.h @@ -237,6 +237,9 @@ static inline __be32 mptcp_reset_option(const struct sk= _buff *skb) } =20 void mptcp_active_detect_blackhole(struct sock *sk, bool expired); + +int mptcp_setsockopt(struct sock *sk, int level, int optname, + sockptr_t optval, unsigned int optlen); #else =20 static inline void mptcp_init(void) @@ -314,6 +317,12 @@ static inline struct request_sock *mptcp_subflow_reqsk= _alloc(const struct reques static inline __be32 mptcp_reset_option(const struct sk_buff *skb) { retu= rn htonl(0u); } =20 static inline void mptcp_active_detect_blackhole(struct sock *sk, bool exp= ired) { } + +static inline int mptcp_setsockopt(struct sock *sk, int level, int optname, + sockptr_t optval, unsigned int optlen) +{ + return -EINVAL; +} #endif /* CONFIG_MPTCP */ =20 #if IS_ENABLED(CONFIG_MPTCP_IPV6) diff --git a/net/core/filter.c b/net/core/filter.c index b446aa8be5c3..18e650bf7393 100644 --- a/net/core/filter.c +++ b/net/core/filter.c @@ -5683,6 +5683,13 @@ static int __bpf_setsockopt(struct sock *sk, int lev= el, int optname, if (!sk_fullsock(sk)) return -EINVAL; =20 + /* Route any bpf_setsockopt on the mptcp socket to mptcp_setsockopt, + * which handles all levels. + */ + if (IS_ENABLED(CONFIG_MPTCP) && sk->sk_protocol =3D=3D IPPROTO_MPTCP) + return mptcp_setsockopt(sk, level, optname, + KERNEL_SOCKPTR(optval), optlen); + if (level =3D=3D SOL_SOCKET) return sol_socket_sockopt(sk, optname, optval, &optlen, false); else if (IS_ENABLED(CONFIG_INET) && level =3D=3D SOL_IP) --=20 2.43.0 From nobody Sat Jul 25 07:27:01 2026 Received: from out-184.mta0.migadu.com (out-184.mta0.migadu.com [91.218.175.184]) (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 9C1D42D7393 for ; Tue, 21 Jul 2026 02:41:32 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=91.218.175.184 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1784601694; cv=none; b=lvNweVtGsHwVbAfpe5yYELr8u+j+0nPb6SD5ezmJq0kiAoJgCs7hP/CVYaXmmfw97eHw8hAOCLp4vikw3QD+te/zvrUMGAXwc4IeuVWLF6YhhcIc1hDEFhHWXa4beVrM0RdNNyBcmAOUouR6FRRPQFmDJ0PFMARj223HlgKIQTE= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1784601694; c=relaxed/simple; bh=f5nWJsQVcqZyMZ02buAygOBp0kQkvTQD11IZGWYZ0SQ=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=gn2Lyc9B3Ou8Ii+Y5JcCbvUVJJwskfvjsAihesCQ5UGos/rBkrLeT5B8o9zS9bsSqqJc/uowp+zo6ETTbV5z2o9ZVMXpyGZwEN08X6susT9sPHdwjwriQEnO7tNQTGtdRBwroe3Bd/Xx35XFW4mTG02sIlOSU+DdSDfGW+12KDA= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=linux.dev; spf=pass smtp.mailfrom=linux.dev; dkim=pass (1024-bit key) header.d=linux.dev header.i=@linux.dev header.b=fTRayyqM; arc=none smtp.client-ip=91.218.175.184 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=linux.dev Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=linux.dev Authentication-Results: smtp.subspace.kernel.org; dkim=pass (1024-bit key) header.d=linux.dev header.i=@linux.dev header.b="fTRayyqM" X-Report-Abuse: Please report any abuse attempt to abuse@migadu.com and include these headers. DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linux.dev; s=key1; t=1784601690; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=vFRGVrKyfQotH2yZszV+apIkLOjiNp0NWO2xaay3NcQ=; b=fTRayyqMoNAEehksFwc/o6MPdP1r4uTtsfATMxa9HMJkv9QZNFX5XNCKXaNhmN8avw559S GN+qI6W/WIRZi1NbFvwKSMVP/wSZRxEaLC7+ZpoQEU/AvSnY0mo+yrbYYe9NVkLXg8S8qL KWZO9dejQHH94UEyTLy8xaJUjGIFZY4= From: Gang Yan To: mptcp@lists.linux.dev Cc: pabeni@redhat.com, Gang Yan Subject: [PATCH mptcp-next v2 6/7] mptcp: add TCP_CONNECT_CB sock_ops hook Date: Tue, 21 Jul 2026 10:41:01 +0800 Message-ID: In-Reply-To: References: Precedence: bulk X-Mailing-List: mptcp@lists.linux.dev List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-Migadu-Flow: FLOW_OUT Content-Type: text/plain; charset="utf-8" From: Gang Yan This patch adds a helper named 'mptcp_call_bpf' like tcp_call_bpf. Invoke the new helper from mptcp_connect() with BPF_SOCK_OPS_TCP_CONNECT_CB, placed after the subflow lock is acquired and before tcp_connect(). At this point the msk lock is held by __inet_stream_connect(), mirroring the placement of TCP_CONNECT_CB in tcp_v4_connect()/tcp_v6_connect(). 'bpf_sock_ops_cb_flags_set' can be called via msk, so using sk_is_tcp() to avoid this issue. Signed-off-by: Gang Yan --- Note: I'm using CONFIG_BPF_JIT here because it is used in bpf.c for conditional compilation. However, maybe the macro in bpf.c should be changed to CONFIG_BPF instead? WDYT? --- net/core/filter.c | 3 +++ net/mptcp/protocol.c | 6 ++++++ net/mptcp/protocol.h | 29 +++++++++++++++++++++++++++++ 3 files changed, 38 insertions(+) diff --git a/net/core/filter.c b/net/core/filter.c index 18e650bf7393..2f9778181279 100644 --- a/net/core/filter.c +++ b/net/core/filter.c @@ -6097,6 +6097,9 @@ BPF_CALL_2(bpf_sock_ops_cb_flags_set, struct bpf_sock= _ops_kern *, bpf_sock, if (!IS_ENABLED(CONFIG_INET) || !sk_fullsock(sk)) return -EINVAL; =20 + if (!sk_is_tcp(sk)) + return -EOPNOTSUPP; + tcp_sk(sk)->bpf_sock_ops_cb_flags =3D val; =20 return argval & (~BPF_SOCK_OPS_ALL_CB_FLAGS); diff --git a/net/mptcp/protocol.c b/net/mptcp/protocol.c index ffcf5a1788f6..837bb76e5c2d 100644 --- a/net/mptcp/protocol.c +++ b/net/mptcp/protocol.c @@ -4149,6 +4149,12 @@ static int mptcp_connect(struct sock *sk, struct soc= kaddr_unsized *uaddr, if (!msk->fastopening) lock_sock(ssk); =20 + /* Notify cgroup BPF on the msk before initiating the subflow connect. + * Mirrors BPF_SOCK_OPS_TCP_CONNECT_CB; msk lock is held by the + * caller (__inet_stream_connect) and ssk is held before. + */ + mptcp_call_bpf(sk, BPF_SOCK_OPS_TCP_CONNECT_CB, 0, NULL); + /* the following mirrors closely a very small chunk of code from * __inet_stream_connect() */ diff --git a/net/mptcp/protocol.h b/net/mptcp/protocol.h index da40c6f3705f..e862310b2f81 100644 --- a/net/mptcp/protocol.h +++ b/net/mptcp/protocol.h @@ -1374,4 +1374,33 @@ mptcp_token_join_cookie_init_state(struct mptcp_subf= low_request_sock *subflow_re static inline void mptcp_join_cookie_init(void) {} #endif =20 +#ifdef CONFIG_BPF_JIT +static inline int mptcp_call_bpf(struct sock *sk, int op, u32 nargs, u32 *= args) +{ + struct bpf_sock_ops_kern sock_ops; + int ret; + + memset(&sock_ops, 0, offsetof(struct bpf_sock_ops_kern, temp)); + + if (sk_fullsock(sk)) { + sock_ops.is_fullsock =3D 1; + sock_owned_by_me(sk); + } + + sock_ops.sk =3D sk; + sock_ops.op =3D op; + + if (nargs > 0) + memcpy(sock_ops.args, args, nargs * sizeof(*args)); + + ret =3D BPF_CGROUP_RUN_PROG_SOCK_OPS(&sock_ops); + return ret =3D=3D 0 ? sock_ops.reply : -1; +} +#else +static inline int mptcp_call_bpf(struct sock *sk, int op, u32 nargs, u32 *= args) +{ + return -1; +} +#endif + #endif /* __MPTCP_PROTOCOL_H */ --=20 2.43.0 From nobody Sat Jul 25 07:27:01 2026 Received: from out-179.mta0.migadu.com (out-179.mta0.migadu.com [91.218.175.179]) (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 B0F312D7393 for ; Tue, 21 Jul 2026 02:41:35 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=91.218.175.179 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1784601697; cv=none; b=Pd+/W5RX6Rs96igMCIgjCvTNNv0w53jAnqHvneC0r5Mvgqpqj09WZKEdOAxEKGr6gYsijVxqbjMgmOXfRz6SSU6qV7ISfTZX+xGdXBWurnUXO+cCQHqrWfhPVMtfowZEPrCvp8Fw9gEHDCJMW+EgE+D9PlDBdQV213wCe/F4sRM= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1784601697; c=relaxed/simple; bh=5ENV5Fd57hzmb7xSW4bYLIJnGboG3xK5zWrvvfpNfQU=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=MssDmRnkcm3dA93/dJm0b3v7Uw4dlota7+33ZkD7Z3Jx87cQh4JaAQjqG3QTP3I5KfWBtPaONcjaWYuNOUm0wNFv0MBpXNJkXU5scjdk4t2ywa98gY/nP3sJgGLtN3h2xGaK+b+6IQBLQsmV4VtmQ+Uh20OBiJY5wUpsNpEfS1U= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=linux.dev; spf=pass smtp.mailfrom=linux.dev; dkim=pass (1024-bit key) header.d=linux.dev header.i=@linux.dev header.b=UlTyH8kC; arc=none smtp.client-ip=91.218.175.179 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=linux.dev Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=linux.dev Authentication-Results: smtp.subspace.kernel.org; dkim=pass (1024-bit key) header.d=linux.dev header.i=@linux.dev header.b="UlTyH8kC" X-Report-Abuse: Please report any abuse attempt to abuse@migadu.com and include these headers. DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linux.dev; s=key1; t=1784601693; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=u5KSWnznuuD2BQAMxk3d2zE+dJZ+HCdUDIt7xKsPYug=; b=UlTyH8kCdWAsQWw7lWHIlHqWTimNNc33PDKaAywgojxik0oezk5nLNSUJOt33KjYXO+hWt H+QH6ZJ5WdbJ2RgROz4QfUFNKp0XYIkHd9RkrP9kD+8lKuXSw4PZ8nCsL3VYr6DgGEEJ0f 8Eu4etBPAHaCVLjy3DbzdnMJ5+ccfaU= From: Gang Yan To: mptcp@lists.linux.dev Cc: pabeni@redhat.com, Gang Yan Subject: [PATCH mptcp-next v2 7/7] selftests: bpf: verify mptcp bpf_setsockopt from TCP_CONNECT_CB Date: Tue, 21 Jul 2026 10:41:02 +0800 Message-ID: In-Reply-To: References: Precedence: bulk X-Mailing-List: mptcp@lists.linux.dev List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-Migadu-Flow: FLOW_OUT Content-Type: text/plain; charset="utf-8" From: Gang Yan Add a BPF sockops program attached to BPF_CGROUP_SOCK_OPS that fires on BPF_SOCK_OPS_TCP_CONNECT_CB and exercises bpf_setsockopt() on the mptcp master socket (msk). Two scenarios are covered by the new "setsockopt" subtest: - TCP_INQ must succeed and the value (1) must be observable from userspace via getsockopt() on the mptcp socket. - TCP_CONGESTION needs the subflow lock and is therefore rejected in bpf context with -EOPNOTSUPP. Signed-off-by: Gang Yan --- .../testing/selftests/bpf/prog_tests/mptcp.c | 61 +++++++++++++++++++ .../selftests/bpf/progs/mptcp_setsockopt.c | 32 ++++++++++ 2 files changed, 93 insertions(+) create mode 100644 tools/testing/selftests/bpf/progs/mptcp_setsockopt.c diff --git a/tools/testing/selftests/bpf/prog_tests/mptcp.c b/tools/testing= /selftests/bpf/prog_tests/mptcp.c index 7f48fd9e94e1..ad59f8fcbb68 100644 --- a/tools/testing/selftests/bpf/prog_tests/mptcp.c +++ b/tools/testing/selftests/bpf/prog_tests/mptcp.c @@ -18,6 +18,7 @@ #include "mptcp_bpf_rr.skel.h" #include "mptcp_bpf_red.skel.h" #include "mptcp_bpf_burst.skel.h" +#include "mptcp_setsockopt.skel.h" =20 #define NS_TEST "mptcp_ns" #define ADDR_1 "10.0.1.1" @@ -813,6 +814,64 @@ static void test_burst(void) mptcp_bpf_burst__destroy(skel); } =20 +static void test_setsockopt(void) +{ + struct mptcp_setsockopt *skel; + struct netns_obj *netns; + int cgroup_fd, server_fd, client_fd; + int err; + int inq; + socklen_t len; + + cgroup_fd =3D test__join_cgroup("/mptcp_setsockopt"); + if (!ASSERT_OK_FD(cgroup_fd, "join_cgroup")) + return; + + skel =3D mptcp_setsockopt__open_and_load(); + if (!ASSERT_OK_PTR(skel, "skel_open_load")) + goto close_cgroup; + + skel->links.mptcp_connect_cb =3D + bpf_program__attach_cgroup(skel->progs.mptcp_connect_cb, + cgroup_fd); + if (!ASSERT_OK_PTR(skel->links.mptcp_connect_cb, "attach connect_cb")) + goto skel_destroy; + + netns =3D netns_new(NS_TEST, true); + if (!ASSERT_OK_PTR(netns, "netns_new")) + goto skel_destroy; + + server_fd =3D start_mptcp_server(AF_INET, NULL, 0, 0); + if (!ASSERT_OK_FD(server_fd, "start_mptcp_server")) + goto close_netns; + + client_fd =3D connect_to_fd(server_fd, 0); + if (!ASSERT_OK_FD(client_fd, "connect_to_fd")) + goto close_server; + + /* TCP_INQ should be set successfullly */ + ASSERT_EQ(skel->bss->connect_cb_inq_ret, 0, "connect_cb TCP_INQ ret"); + + len =3D sizeof(inq); + err =3D getsockopt(client_fd, SOL_TCP, TCP_INQ, &inq, &len); + if (ASSERT_OK(err, "getsockopt TCP_INQ")) + ASSERT_EQ(inq, 1, "TCP_INQ value"); + + /* TCP_CONGESTION should be -EOPNOTSUPP */ + ASSERT_EQ(skel->bss->connect_cb_cc_ret, -EOPNOTSUPP, + "connect_cb TCP_CONGESTION ret"); + + close(client_fd); +close_server: + close(server_fd); +close_netns: + netns_free(netns); +skel_destroy: + mptcp_setsockopt__destroy(skel); +close_cgroup: + close(cgroup_fd); +} + void test_mptcp(void) { if (test__start_subtest("base")) @@ -835,4 +894,6 @@ void test_mptcp(void) test_red(); if (test__start_subtest("burst")) test_burst(); + if (test__start_subtest("setsockopt")) + test_setsockopt(); } diff --git a/tools/testing/selftests/bpf/progs/mptcp_setsockopt.c b/tools/t= esting/selftests/bpf/progs/mptcp_setsockopt.c new file mode 100644 index 000000000000..f54b77ea6c5f --- /dev/null +++ b/tools/testing/selftests/bpf/progs/mptcp_setsockopt.c @@ -0,0 +1,32 @@ +#include "bpf_tracing_net.h" +#include "mptcp_bpf.h" + +#ifndef TCP_INQ +#define TCP_INQ 36 +#endif + +int connect_cb_inq_ret; +int connect_cb_cc_ret; + +char cc_reno[TCP_CA_NAME_MAX] =3D "reno"; + +SEC("sockops") +int mptcp_connect_cb(struct bpf_sock_ops *skops) +{ + struct bpf_sock *sk =3D skops->sk; + int one =3D 1; + + if (skops->op !=3D BPF_SOCK_OPS_TCP_CONNECT_CB) + return 1; + + if (!sk || sk->protocol !=3D IPPROTO_MPTCP) + return 1; + + connect_cb_inq_ret =3D + bpf_setsockopt(skops, SOL_TCP, TCP_INQ, &one, sizeof(one)); + connect_cb_cc_ret =3D + bpf_setsockopt(skops, SOL_TCP, TCP_CONGESTION, + cc_reno, sizeof(cc_reno)); + + return 1; +} --=20 2.43.0