From nobody Mon Aug 24 20:40:37 2026 Received: from out-182.mta0.migadu.com (out-182.mta0.migadu.com [91.218.175.182]) (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 7625136195B for ; Mon, 27 Jul 2026 02:29:45 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=91.218.175.182 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1785119387; cv=none; b=EfJUAJXGt573bsbiHS3jZ3Kcq1t9aFpS/CEZMDdoei52dZo3xiXil5H5OYAC61b2utfXy0cnVLJXrxT3Sx+FXfRVifVSk06b/W4c9g1xLgEw798EOv/ApSGfyQciD1hlN098/ljgO2+RWILJlZg7NF52S/UQKZ4NxkRvciUBN2g= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1785119387; c=relaxed/simple; bh=6wfibqnOLMR0ktaIFslCHrqRHEi2i1YDEreYu2sdh2Q=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=QaLfnYBQ7OrZebLCjdBsFi9UJQjg6tBcom0VetstQO5MdonizITSydcXwXsgWIpYhOyBxtrE5z3aQzGP8EbH2j+cm+rtIARAEoX17OeuiYgcVxVLW7xlVW9rDyvyvQnlZUaCMztu9fyfZxlMFRsX8Nx15dTZaHeHZ5pltHzOvis= 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=Z44i+Oye; arc=none smtp.client-ip=91.218.175.182 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="Z44i+Oye" 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=1785119382; 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=Z44i+OyeMM7TIE306HjfUDYxT2IgPX9jvTwOoFML5V4tnMjbJx5cEg1N/NUy8vAbbTNZJQ QG2F1z83+qCN0mG3rUYkshUeJeL7k6OT9HyfTqEEc2X5GiZK1/d0LKOgUlLQIhMqWLDMij s+UquSee+8F9ouOfY+ou4jAXlOZJGCw= From: Gang Yan To: mptcp@lists.linux.dev Cc: Gang Yan Subject: [PATCH mptcp-next v3 1/7] mptcp: drop unused @max arg of __mptcp_setsockopt_set_val Date: Mon, 27 Jul 2026 10:28:43 +0800 Message-ID: <20260727022849.20923-2-gang.yan@linux.dev> In-Reply-To: <20260727022849.20923-1-gang.yan@linux.dev> References: <20260727022849.20923-1-gang.yan@linux.dev> 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 Mon Aug 24 20:40:37 2026 Received: from out-180.mta0.migadu.com (out-180.mta0.migadu.com [91.218.175.180]) (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 B3956363086 for ; Mon, 27 Jul 2026 02:29:46 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=91.218.175.180 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1785119389; cv=none; b=XGLW+vBl8sSRPA3jN+FqKUYWYiIq6ha2GS2BDA20Cbw7gR7nUPJIQXv7UWwnZ8V/zVvr2neM3bGI/PzKQ27olvFJ0pmPQNiXKyY+8O3uu0fASyuXnPZl36fNUdCydCrw1/AaDl+4yMs6FaWPGnx+4OcUoGALgfQ4sHDjcTjW0hQ= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1785119389; c=relaxed/simple; bh=LIf7pYTQe5gFC3YD3BPwo7fV1ZFkjFvVMAq4MOw705k=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=JaGqjSGJUp74UlQXA8j6NQtGGM1K0jcStXv4xfpT/jeU+INA/Ur8G0udDGzKc3mOx8DLoii4i5mRSciN44xSBPy3MSZ3eHWWy64qQW8/mOPWzZ9MpKGdBocU8UoBm4B2bpBk3QI8ReeYGTqSkvL+H8eAubELKCsjw1vNtdQDUMg= 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=xerjUy4+; arc=none smtp.client-ip=91.218.175.180 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="xerjUy4+" 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=1785119384; 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=uUoMrCeHxUNbHSWyrBWNgupQf2D4kFYpm6ax4sftE1k=; b=xerjUy4+lOKEy9QvkKom/FI1vUoFrhwttaKBFKu98QkYPMTeHAaX75g3aCWu/kvsbhkupm HbWH+twrJELXO0SeqSfg1zaYk9YOYdEDXIIQjR0unDDWbB/93ORya4XsGovNImOGHZPS12 JFijltyuQt4+qJ3H5p2f2hSYXlCB+TQ= From: Gang Yan To: mptcp@lists.linux.dev Cc: Gang Yan Subject: [PATCH mptcp-next v3 2/7] mptcp: take TCP_MAXSEG handling into __mptcp_setsockopt_set_val Date: Mon, 27 Jul 2026 10:28:44 +0800 Message-ID: <20260727022849.20923-3-gang.yan@linux.dev> In-Reply-To: <20260727022849.20923-1-gang.yan@linux.dev> References: <20260727022849.20923-1-gang.yan@linux.dev> 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 | 5 ++--- 2 files changed, 3 insertions(+), 3 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..a7d4135757e7 100644 --- a/net/mptcp/sockopt.c +++ b/net/mptcp/sockopt.c @@ -889,9 +889,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 Mon Aug 24 20:40:37 2026 Received: from out-183.mta0.migadu.com (out-183.mta0.migadu.com [91.218.175.183]) (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 AD72F35E1AE for ; Mon, 27 Jul 2026 02:29:48 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=91.218.175.183 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1785119390; cv=none; b=UIvDLYMToLfzY+aOB+GZkD+T//E8GeK9l34ongEyYWQ8ddOIgNQGsABopVHJaemxDX6/XnII1u121WrLM+Aaa3CcM52paZ5X6F31z5fwNDtOUS+tq2UiKQEXr+BFxsPuVYf+tI2vvGI61Y90oOLA1vFZdwTQhrGXbndbg9umgXA= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1785119390; c=relaxed/simple; bh=NGpualsv4UOpTyo+hN51G+tZ+BaArzmrtcF/AKCKp+Y=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=UexLx23mAGbX5YwjW2ilUTSKot3koNvfKGHEU5j8Ix/Z07QK+aZwWKNQgO5m6RxFENNP+4PQsY2hRpQrv8K75I+eZpxpiw2BJFWPZxvirjfJOpzJoyn2P/T3y9hFUTeCu/FXH9WtcKH9aAbOiWERGLfSCdcQC6vxpcLAc0y3N0I= 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=hIjgTkaV; arc=none smtp.client-ip=91.218.175.183 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="hIjgTkaV" 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=1785119386; 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=CkMfPAfuHS8MJ+gAskUwod2pjLBlDeXA+fQFfnpePTk=; b=hIjgTkaVVfuhnChY1YZ0ceis7eHpVecD4gW9fa0diRtIJHFPwMUMHAxExPnjhe0GfHTLjG yly1lyaO0JZ4OzSXqteaqcFNd/TwhLnQRz1z0XU3xZFCG2AOhCXrV8I7q2smOeYplWWHPa jJiaplDTMPLGJK8Agq39tip7xDH2YNk= From: Gang Yan To: mptcp@lists.linux.dev Cc: Gang Yan Subject: [PATCH mptcp-next v3 3/7] mptcp: use sockopt_lock/release_sock in sockopt Date: Mon, 27 Jul 2026 10:28:45 +0800 Message-ID: <20260727022849.20923-4-gang.yan@linux.dev> In-Reply-To: <20260727022849.20923-1-gang.yan@linux.dev> References: <20260727022849.20923-1-gang.yan@linux.dev> 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 a7d4135757e7..f00d85809c52 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 @@ -857,7 +857,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) @@ -896,7 +896,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 @@ -920,9 +920,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 @@ -945,7 +945,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; @@ -960,7 +960,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 @@ -1131,7 +1131,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); @@ -1144,7 +1144,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 @@ -1154,7 +1154,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 @@ -1223,7 +1223,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); @@ -1236,7 +1236,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 @@ -1246,7 +1246,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 @@ -1332,7 +1332,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; @@ -1362,7 +1362,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)) @@ -1371,7 +1371,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 @@ -1526,9 +1526,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 Mon Aug 24 20:40:37 2026 Received: from out-171.mta0.migadu.com (out-171.mta0.migadu.com [91.218.175.171]) (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 421A7360EE9 for ; Mon, 27 Jul 2026 02:29:50 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=91.218.175.171 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1785119391; cv=none; b=Wg5kt47js5mO9QLKVlGUrltjizjQCf0I5jBaYAN8Rvr2gBsMmpU2pbD2YnbnVnr3qkoOnmWsirYIJrkt0GnjtK7jzSg4jMJ6P1tnQs8eGoWO7fvWIpDhLmpjw8qo/YSIul6ekIbL8DisBqraTkG/QtRT3FbziML0vh+LLayG8xc= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1785119391; c=relaxed/simple; bh=tJkyxLLJ+g5eKbA9bWMGE4y8rJtBbk3XgCzOd6gD/ao=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=RYTu8NW0YDOEDXFWeD6pzO5UXNMv1+ggCpGyDHWIWosCoNB6nRw3vvfuOcjLvmBWkWtvc1DDrt7b3BQS/dQ8X5vUy0eh8Y++4U+Mheh044xID0kyGLe0GEKMC5xJ6q84HG53Oy0AY636aMIHzlURv4+4Yr7XvCkODLDRFdiPaMw= 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=I4fL+40J; arc=none smtp.client-ip=91.218.175.171 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="I4fL+40J" 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=1785119388; 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=ekYWi+TaHQEFUzP9wIijBLXy9R1D1C5MmPLPZ+Eoriw=; b=I4fL+40J5lKx3XyAxMme3GtLeMlXkiQJBQWU6vTYXS6vjkHYc5MlyCYoEycWq4Av5neBvo Zvf83+aMnrNz/D7DMYveozvlaadzTKclWF8q804sNWOupj+o6ZZCaYXZMXCv8CpaKQU3Nn LhkFp/s2POSho1Do+NOjNuvF8oTk3xU= From: Gang Yan To: mptcp@lists.linux.dev Cc: Gang Yan Subject: [PATCH mptcp-next v3 4/7] mptcp: reject sockopt requiring ssks' lock in BPF context Date: Mon, 27 Jul 2026 10:28:46 +0800 Message-ID: <20260727022849.20923-5-gang.yan@linux.dev> In-Reply-To: <20260727022849.20923-1-gang.yan@linux.dev> References: <20260727022849.20923-1-gang.yan@linux.dev> 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 f00d85809c52..a26758a82150 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) @@ -1632,6 +1656,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 Mon Aug 24 20:40:37 2026 Received: from out-171.mta0.migadu.com (out-171.mta0.migadu.com [91.218.175.171]) (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 92D962045AD for ; Mon, 27 Jul 2026 02:29:51 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=91.218.175.171 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1785119393; cv=none; b=ZF9kye4l4H3a4QFpem1YX5Nx4qL/fqiqD28neT56ExUHIV/rSZmxjA0PHhv7Y7JfSFs45UZfDf+fXvHJsa/WkudPK9g6QOIMhGkkNSCJNCIj4iYqiZN9wKhcHfdR4xrwvwty5Hv2Kmty6gC8Xg9Lkikddjye3E0/+s8K6JvXFAk= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1785119393; c=relaxed/simple; bh=RwQ2ZyRTWdsJB94Xk5fSutnmDGpQxU3yZiJdz8aqBxY=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=m9PhOIafzkeYl+OmQbDTYW04bL7qqDs5soSh30aoyvAzikebr7NI06TOoZum9NDBRzKaqZ0zphPkDjd1aTR+aSin0raMqwbOEGLthouLqnOjqjjwolnGqIz7hTRYVH/KJMeqnDn3qP8vRz70N9HyFIPhu7oAnhMYiJNhFAAfRV4= 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=vGzd+kyy; arc=none smtp.client-ip=91.218.175.171 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="vGzd+kyy" 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=1785119389; 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=vGzd+kyyndgDZA8cNPSwrlEYdWMX0snxrN3bwCXObf+l6+4zVBGl/LESV/llaBBVeTrvqD W7EMI+9jp1xQhJ/yReatSpc3D2liNgKdN2ZDtphi1UXrOypqZu85T+9W2SacN9gkNsFQ/3 Z7FFzbm5tQLWwZkA7ED/I+uIvSQpaLM= From: Gang Yan To: mptcp@lists.linux.dev Cc: Gang Yan Subject: [PATCH mptcp-next v3 5/7] mptcp: enable bpf_setsockopt on the master socket Date: Mon, 27 Jul 2026 10:28:47 +0800 Message-ID: <20260727022849.20923-6-gang.yan@linux.dev> In-Reply-To: <20260727022849.20923-1-gang.yan@linux.dev> References: <20260727022849.20923-1-gang.yan@linux.dev> 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 Mon Aug 24 20:40:37 2026 Received: from out-185.mta0.migadu.com (out-185.mta0.migadu.com [91.218.175.185]) (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 C7C84363C48 for ; Mon, 27 Jul 2026 02:29:53 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=91.218.175.185 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1785119395; cv=none; b=BXVznBqORBzNi25AsLdCdXpmckrOLYBUa7hFpPhj+az/5Yw/mT7oly4kS5rdkSR+lAyt99dnhTCvIbEypJCvdNsYTHmVNfrc9yN4ZTfGGvGOuFxpgS0U7hdRu2KJcg2oC+98IOf5BdnB0CZEiSZx0DJFO5EXsMm9uY6cNP2iYZg= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1785119395; c=relaxed/simple; bh=u9rOxdo46iYB47A/63iPa4+zqlamizywuT2wExIeXdo=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=DamSbSKl2iC2oorw/srqYsw4En1scC+9A6wdyNvbbUN81CgqTG/elz+VhJkqWav5sQ0CV7i6LrY4Wrrz+vW5SszNP5ugCieZpTCWFyH6S66UPbBNmxanaJFAeNco9Khzjq37vXpJFUyFDyD22H0qkLEJXsF8EYYC3bT35v9kIiA= 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=tWW/jA4E; arc=none smtp.client-ip=91.218.175.185 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="tWW/jA4E" 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=1785119391; 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=PsBoRQaC3WCt4CgwfpkF2/eFkbf4253syltUQVweLlI=; b=tWW/jA4EPUMQKYrIJMnIMuhzQWN86YY/+oOjZtcTEQsOXtCHsaeXgdUvHv0Rg51PLsvbkW C+CTys8EIJSSfkd+m1Ii+RtJA9KHcCOs8NgUvqeh5YLQWC33aWXSvvtC5D0QQyqqWYUAgM DOhgjXXqPZW3okRpPOQFqKXoV5bLYZU= From: Gang Yan To: mptcp@lists.linux.dev Cc: Gang Yan Subject: [PATCH mptcp-next v3 6/7] mptcp: add TCP_CONNECT_CB sock_ops hook Date: Mon, 27 Jul 2026 10:28:48 +0800 Message-ID: <20260727022849.20923-7-gang.yan@linux.dev> In-Reply-To: <20260727022849.20923-1-gang.yan@linux.dev> References: <20260727022849.20923-1-gang.yan@linux.dev> 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 --- 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 Mon Aug 24 20:40:37 2026 Received: from out-180.mta0.migadu.com (out-180.mta0.migadu.com [91.218.175.180]) (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 F013536215B for ; Mon, 27 Jul 2026 02:29:54 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=91.218.175.180 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1785119397; cv=none; b=HzNA6QxB9t72sY4O7Zruu6gorHOTpnHmk6BNcabG4TqoPzYSNkZLz9BYM+sgan4Gjz/pb9DgPDJOLwcVrSAJGIf2As1RVF+mvri+Hx4o00Ua8t5dYIpcWZ2m99ul0ycKlirof2rBZpMZ0VSYkA9ZcCw+OLzW86X+d2ZPuy3e+IQ= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1785119397; c=relaxed/simple; bh=5ENV5Fd57hzmb7xSW4bYLIJnGboG3xK5zWrvvfpNfQU=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=CmdrZuPND07Gigr3GYKR8B5G8Rl76XfvNyNGymmslpdMuo/M2n2PYjmT/bnBO74Xd1ZOseacqZaFVhZJbm4VbMjUBe8mIVKTY7dNAHZtuX0lQdbSSCKrvJxn6izzCeoHWhmuiwfTF6yDAXTntXsNnUEGFchKlVM5S9GdkZKqNhc= 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=t89t0ZS8; arc=none smtp.client-ip=91.218.175.180 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="t89t0ZS8" 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=1785119393; 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=t89t0ZS861Ga1j39+dGCjkQU+fbAX7FFAgwEyp8Y9RIL7YeC1i2yW0zCYIw4wLfJyyDhiE wKFtH2p7Yh6BTN5lIqece0mTrXkDPreiCZQRoqD6Wxxy+FSJGbT54Pb3I4/Jmp7afCm43H 750jqLPayEqQ3NCSZ0ykYg4nOVzcKEk= From: Gang Yan To: mptcp@lists.linux.dev Cc: Gang Yan Subject: [PATCH mptcp-next v3 7/7] selftests: bpf: verify mptcp bpf_setsockopt from TCP_CONNECT_CB Date: Mon, 27 Jul 2026 10:28:49 +0800 Message-ID: <20260727022849.20923-8-gang.yan@linux.dev> In-Reply-To: <20260727022849.20923-1-gang.yan@linux.dev> References: <20260727022849.20923-1-gang.yan@linux.dev> 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