From nobody Mon May 25 04:19:37 2026 Received: from out-172.mta1.migadu.com (out-172.mta1.migadu.com [95.215.58.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 875A0358360 for ; Fri, 22 May 2026 09:12:53 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=95.215.58.172 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1779441175; cv=none; b=LlWXAhJd4rrypdsbX1nPPUkOXyHsTxcNMwV3v8dt7GDQYJMXGns2IMcilMuOP2ld4n4SF4txjZ1vXA4mEtWW4SrBcjxXAPO7HLZldAh5zmrMcChi0TztJ5aD19VuozVYssGMldNgaAJKvgMlrfvzxE2mzbPEglO3CGHHJndYS+M= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1779441175; c=relaxed/simple; bh=K3y1K/KFNpYe2CZYGuIiLPIV/7xHaHM54y5KQQqL9Fw=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=Re7JnUsdDtO19I7Ep4K2RzdA6tcATYQxWTJkV8pxxrV5M1WS/rQy21/tMtiaP3dxZxsmrZoEA44pa4NZvSqJcarB0lGYN52BEpuWUCGezCsghk8k2YI2ngTRKbxTRHcFJ6crcclLukBPEO7FV9NPyEMir1FPBmBQQPdXuQnCOoI= 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=thVOsehW; arc=none smtp.client-ip=95.215.58.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="thVOsehW" 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=1779441171; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=onjfyP1u1aDKTa9Tjki765y2aYux/WNHnsuuGsZ89Ig=; b=thVOsehWGqYR9CFrPZyCbqjeChOm72gZ6hj0/hoei7qYy+Y4aee4IDtwTa1nYD4+uvF1At peSrr/bRBmkaPoSvxLj2UhJkRp+tG//ZBA4Fys87QmdTKwMLDdNzuLcBxrQFZOG+YpaxlN bB7GBcLKepNnjdvJbOELE4BfhCkM3ZI= From: Gang Yan Date: Fri, 22 May 2026 17:12:31 +0800 Subject: [PATCH mptcp-next v5 1/6] mptcp: replace lock_sock_fast with lock_sock in sockopt Precedence: bulk X-Mailing-List: mptcp@lists.linux.dev List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20260522-sockopt_lock-v5-1-108629a46e98@kylinos.cn> References: <20260522-sockopt_lock-v5-0-108629a46e98@kylinos.cn> In-Reply-To: <20260522-sockopt_lock-v5-0-108629a46e98@kylinos.cn> To: MPTCP Linux Cc: Gang Yan , pabeni@redhat.com X-Migadu-Flow: FLOW_OUT From: Gang Yan Replace lock_sock_fast()/unlock_sock_fast() with lock_sock()/ release_sock() in the MPTCP sockopt handlers to avoid accidentally introducing sleeping operations inside the lock_sock_fast() critical section. This is consistent with how other sockopt handlers in the Net code already use lock_sock()/release_sock(). Signed-off-by: Gang Yan --- net/mptcp/sockopt.c | 18 ++++++++---------- 1 file changed, 8 insertions(+), 10 deletions(-) diff --git a/net/mptcp/sockopt.c b/net/mptcp/sockopt.c index 1cf608e7357b..35a74e44a500 100644 --- a/net/mptcp/sockopt.c +++ b/net/mptcp/sockopt.c @@ -77,8 +77,8 @@ static void mptcp_sol_socket_sync_intval(struct mptcp_soc= k *msk, int optname, in =20 mptcp_for_each_subflow(msk, subflow) { struct sock *ssk =3D mptcp_subflow_tcp_sock(subflow); - bool slow =3D lock_sock_fast(ssk); =20 + lock_sock(ssk); switch (optname) { case SO_DEBUG: sock_valbool_flag(ssk, SOCK_DBG, !!val); @@ -114,7 +114,7 @@ static void mptcp_sol_socket_sync_intval(struct mptcp_s= ock *msk, int optname, in } =20 subflow->setsockopt_seq =3D msk->setsockopt_seq; - unlock_sock_fast(ssk, slow); + release_sock(ssk); } =20 release_sock(sk); @@ -270,8 +270,8 @@ static int mptcp_setsockopt_sol_socket_linger(struct mp= tcp_sock *msk, sockptr_t sockopt_seq_inc(msk); mptcp_for_each_subflow(msk, subflow) { struct sock *ssk =3D mptcp_subflow_tcp_sock(subflow); - bool slow =3D lock_sock_fast(ssk); =20 + lock_sock(ssk); if (!ling.l_onoff) { sock_reset_flag(ssk, SOCK_LINGER); } else { @@ -280,7 +280,7 @@ static int mptcp_setsockopt_sol_socket_linger(struct mp= tcp_sock *msk, sockptr_t } =20 subflow->setsockopt_seq =3D msk->setsockopt_seq; - unlock_sock_fast(ssk, slow); + release_sock(ssk); } =20 release_sock(sk); @@ -749,11 +749,10 @@ static int mptcp_setsockopt_v4_set_tos(struct mptcp_s= ock *msk, int optname, val =3D READ_ONCE(inet_sk(sk)->tos); mptcp_for_each_subflow(msk, subflow) { struct sock *ssk =3D mptcp_subflow_tcp_sock(subflow); - bool slow; =20 - slow =3D lock_sock_fast(ssk); + lock_sock(ssk); __ip_sock_set_tos(ssk, val); - unlock_sock_fast(ssk, slow); + release_sock(ssk); } release_sock(sk); =20 @@ -1647,12 +1646,11 @@ int mptcp_set_rcvlowat(struct sock *sk, int val) WRITE_ONCE(sk->sk_rcvbuf, space); mptcp_for_each_subflow(mptcp_sk(sk), subflow) { struct sock *ssk =3D mptcp_subflow_tcp_sock(subflow); - bool slow; =20 - slow =3D lock_sock_fast(ssk); + lock_sock(ssk); WRITE_ONCE(ssk->sk_rcvbuf, space); WRITE_ONCE(tcp_sk(ssk)->window_clamp, val); - unlock_sock_fast(ssk, slow); + release_sock(ssk); } return 0; } --=20 2.43.0 From nobody Mon May 25 04:19:37 2026 Received: from out-181.mta1.migadu.com (out-181.mta1.migadu.com [95.215.58.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 C4F693B3BF2 for ; Fri, 22 May 2026 09:12:54 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=95.215.58.181 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1779441177; cv=none; b=MoypyEuO6BZZfnfW1xZoWDkBgGjHDAP9jpvqjigsCysnRwX94uHWBKUAsfVGzZW8l6eKRBVmiwwr0pYCBYEFBpZkCnP24NxpO9yCeVFxMdEuPxOi6kH5ykBL65vmfvUMWhy6Xeu4pnM7PlA0aZ9F3XPdHX7iniwtVZFxm+ikIOI= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1779441177; c=relaxed/simple; bh=JeiGJhs9LVQVpo7LTQ6wcIXDRqAAGs5IF7ZniyMZJEQ=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=g+yzg1flAtBJJeIhoS+fgUtERsvFo2DY5E8VWfJGDkadHMHExUUuKljVR0CRzPlN1BBeXHj4Kgyt32G1+4s8zGmCTBUTdOB5TVPiRbuhn/lMHtjY8ApQ5fbs1OijTY71hBu0C3uDdwa/egKdQQpdTBxs1Mgs2jcNztkvTuL4zP0= 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=HY/MYlxF; arc=none smtp.client-ip=95.215.58.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="HY/MYlxF" 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=1779441173; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=vXrbvXOk1Orycw+JFqajcA/1rhynzjFDL7o6be1/pFo=; b=HY/MYlxFb8OiOkJbeuUzAI+zoiVb2NywCgMgsbmC9T1Q0n371ghzcsF++6xL4JpBjrpl17 ug204YhWjt+9OY27ZhJio8j15eHaN5+io6CRfutwodHCh7qgED0NpOuxVPUXfsayycCoIi z1r2mP4zhvapbR0zjg1nDuwv3mLb224= From: Gang Yan Date: Fri, 22 May 2026 17:12:32 +0800 Subject: [PATCH mptcp-next v5 2/6] mptcp: use sockopt_lock/release_sock in sockopt Precedence: bulk X-Mailing-List: mptcp@lists.linux.dev List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20260522-sockopt_lock-v5-2-108629a46e98@kylinos.cn> References: <20260522-sockopt_lock-v5-0-108629a46e98@kylinos.cn> In-Reply-To: <20260522-sockopt_lock-v5-0-108629a46e98@kylinos.cn> To: MPTCP Linux Cc: Gang Yan , pabeni@redhat.com X-Migadu-Flow: FLOW_OUT 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 35a74e44a500..e69d243bde36 100644 --- a/net/mptcp/sockopt.c +++ b/net/mptcp/sockopt.c @@ -72,7 +72,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) { @@ -117,7 +117,7 @@ static void mptcp_sol_socket_sync_intval(struct mptcp_s= ock *msk, int optname, in release_sock(ssk); } =20 - release_sock(sk); + sockopt_release_sock(sk); } =20 static int mptcp_sol_socket_intval(struct mptcp_sock *msk, int optname, in= t val) @@ -156,7 +156,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 @@ -165,7 +165,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 @@ -231,7 +231,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); @@ -241,7 +241,7 @@ static int mptcp_setsockopt_sol_socket_timestamping(str= uct mptcp_sock *msk, release_sock(ssk); } =20 - release_sock(sk); + sockopt_release_sock(sk); =20 return 0; } @@ -266,7 +266,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); @@ -283,7 +283,7 @@ static int mptcp_setsockopt_sol_socket_linger(struct mp= tcp_sock *msk, sockptr_t release_sock(ssk); } =20 - release_sock(sk); + sockopt_release_sock(sk); return 0; } =20 @@ -299,10 +299,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 @@ -317,7 +317,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: @@ -395,16 +395,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 @@ -424,7 +424,7 @@ static int mptcp_setsockopt_v6(struct mptcp_sock *msk, = int optname, break; } =20 - release_sock(sk); + sockopt_release_sock(sk); break; } =20 @@ -601,7 +601,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); @@ -618,7 +618,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 @@ -697,11 +697,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 @@ -722,13 +722,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 @@ -744,7 +744,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) { @@ -754,7 +754,7 @@ static int mptcp_setsockopt_v4_set_tos(struct mptcp_soc= k *msk, int optname, __ip_sock_set_tos(ssk, val); release_sock(ssk); } - release_sock(sk); + sockopt_release_sock(sk); =20 return 0; } @@ -783,7 +783,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); @@ -793,7 +793,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 @@ -845,7 +845,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) @@ -888,7 +888,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 @@ -912,9 +912,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 @@ -937,7 +937,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; @@ -952,7 +952,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 @@ -1123,7 +1123,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); @@ -1136,7 +1136,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 @@ -1146,7 +1146,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 @@ -1215,7 +1215,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); @@ -1228,7 +1228,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 @@ -1238,7 +1238,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 @@ -1324,7 +1324,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; @@ -1354,7 +1354,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)) @@ -1363,7 +1363,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 @@ -1518,9 +1518,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 May 25 04:19:37 2026 Received: from out-180.mta1.migadu.com (out-180.mta1.migadu.com [95.215.58.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 AF1B93B993A for ; Fri, 22 May 2026 09:12:55 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=95.215.58.180 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1779441177; cv=none; b=YGQ4gYQURPKPw32lM49VtHVYWbIFsS14pBXxzua25Y+jIo6tDaTY6lUppKoAJxLY/1pJ5L4LVKNGU2V0AgjEPocqbuIMLLLyFAbx+W4f4FPWCa1Vb1OVkW31iCk2pILG9rOYJI/A42e5gLXQNM1FEphfebmBSBm5yGT6FHzDUhI= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1779441177; c=relaxed/simple; bh=cUogXGoEOeTcwaR5yLlPhfnDFkCWGhd/UGBvbPRmz54=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=dxx+Zh8tkFA7TEcfTkbFu9UzAzh1MCIwhVDhOjKcEyj6gFczGPB3UNMBAg5YSy0kWFLRfcwqsXkOL8o/8hFr30zOJ3JYW6rSegNu1U1/OB/iPf+nh7OA9WUq6k9/AZNzePQAgTmyvTGTFU07hDecXRFrNU4YKOKrBmtYa2RV9AI= 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=XWt2MDlZ; arc=none smtp.client-ip=95.215.58.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="XWt2MDlZ" 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=1779441174; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=pY7/pbkeayWxlhePh7sAMil/JXfWTnQZpvhICht6ZoU=; b=XWt2MDlZp+QmUHSN7JRIM1cVzb3msl/XXyXWtKBl8MEACqOdeNOLcz/oeywuzDmE4GB0sQ JdcUP7ne92GAM6eKGoWe6X/3n4LdSQNQJquztxveTNljJithW+WOodLTxt0IbaPzhkmdVx QMtWo/uqRPKdgx3MBY8L0Nxc5I17ahA= From: Gang Yan Date: Fri, 22 May 2026 17:12:33 +0800 Subject: [PATCH mptcp-next v5 3/6] mptcp: use sockopt_ns_capable in congestion control Precedence: bulk X-Mailing-List: mptcp@lists.linux.dev List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20260522-sockopt_lock-v5-3-108629a46e98@kylinos.cn> References: <20260522-sockopt_lock-v5-0-108629a46e98@kylinos.cn> In-Reply-To: <20260522-sockopt_lock-v5-0-108629a46e98@kylinos.cn> To: MPTCP Linux Cc: Gang Yan , pabeni@redhat.com X-Migadu-Flow: FLOW_OUT From: Gang Yan When a BPF program calls bpf_setsockopt(), it may run in softirq context where ns_capable() is not appropriate as there is no valid credential context. Use sockopt_ns_capable() instead, which skips the capability check when invoked from a BPF program. Additionally, the load parameter of tcp_set_congestion_control() is changed from 'true' to '!has_current_bpf_ctx()' to match what TCP does: when called from BPF context, use tcp_ca_find() instead of tcp_ca_find_autoload() to avoid module loading in atomic context. Signed-off-by: Gang Yan --- net/mptcp/sockopt.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/net/mptcp/sockopt.c b/net/mptcp/sockopt.c index e69d243bde36..3a5cd3023e59 100644 --- a/net/mptcp/sockopt.c +++ b/net/mptcp/sockopt.c @@ -598,7 +598,7 @@ static int mptcp_setsockopt_sol_tcp_congestion(struct m= ptcp_sock *msk, sockptr_t =20 name[ret] =3D 0; =20 - cap_net_admin =3D ns_capable(sock_net(sk)->user_ns, CAP_NET_ADMIN); + cap_net_admin =3D sockopt_ns_capable(sock_net(sk)->user_ns, CAP_NET_ADMIN= ); =20 ret =3D 0; sockopt_lock_sock(sk); @@ -608,7 +608,7 @@ static int mptcp_setsockopt_sol_tcp_congestion(struct m= ptcp_sock *msk, sockptr_t int err; =20 lock_sock(ssk); - err =3D tcp_set_congestion_control(ssk, name, true, cap_net_admin); + err =3D tcp_set_congestion_control(ssk, name, !has_current_bpf_ctx(), ca= p_net_admin); if (err < 0 && ret =3D=3D 0) ret =3D err; subflow->setsockopt_seq =3D msk->setsockopt_seq; --=20 2.43.0 From nobody Mon May 25 04:19:37 2026 Received: from out-174.mta1.migadu.com (out-174.mta1.migadu.com [95.215.58.174]) (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 BE1603B8D4A for ; Fri, 22 May 2026 09:12:56 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=95.215.58.174 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1779441179; cv=none; b=LnII+8U6//X0vklnVjduVAxZh/8unJ+I7mSF5YIpyqUFN+gFK+1JJkp+49KSxmJJwWSaDSh63wMUSZQmiTrOVrzvFP0MSUGDukEG3y0UcTqT1r8MUY4/3O+fUkyQ2Xey3w/IKWB/kIOzRksHd5PshUZtLVTSJ5bFhL+5fpnAGZU= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1779441179; c=relaxed/simple; bh=8pitMe/5QeL1Rp7IWy3xILIitsGuPhE1AXG0p3kP9mY=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=O7a8pvbmy2BaAxIu8DG0tX1d3rZ1FHt+I0Xc8/rkl0FxY81zI+ILVuCtmZr+PS54n/YGM79Vz1KmggUCsUIo0OajVV7TH3GoDOx/D3gDT9j0+VQHkI2u4LPnPtM5KCfze+ZYhPMR8MJeSi0sdN8KmhDsyh9iNIGrvNS626bEw6c= 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=f7e6aDCn; arc=none smtp.client-ip=95.215.58.174 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="f7e6aDCn" 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=1779441175; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=4CMHPPv9g5SSBKyhU5d8PEpw3R9cxKQHSb/jNK37qX4=; b=f7e6aDCn/5btxM+YSm0RgCCRji7C289hriNoLy/A8zFs+J095X9aOTupodt3DS3S5ZQiqt WdpZFnHeT+SRzP/UfZubpIjgG1RPlaKwo+FGAzNm58aYyfHaGfwVEmRWlk9WGiym4ThXhE 8KyHmZYbfMDJSiQt36/oiZ+gIOqEfWU= From: Gang Yan Date: Fri, 22 May 2026 17:12:34 +0800 Subject: [PATCH mptcp-next v5 4/6] mptcp: reject sockopt requiring ssks' lock in BPF context Precedence: bulk X-Mailing-List: mptcp@lists.linux.dev List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20260522-sockopt_lock-v5-4-108629a46e98@kylinos.cn> References: <20260522-sockopt_lock-v5-0-108629a46e98@kylinos.cn> In-Reply-To: <20260522-sockopt_lock-v5-0-108629a46e98@kylinos.cn> To: MPTCP Linux Cc: Gang Yan , pabeni@redhat.com X-Migadu-Flow: FLOW_OUT 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 3a5cd3023e59..622a8de36567 100644 --- a/net/mptcp/sockopt.c +++ b/net/mptcp/sockopt.c @@ -179,6 +179,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: @@ -212,6 +215,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))) @@ -255,6 +261,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 @@ -600,6 +609,9 @@ static int mptcp_setsockopt_sol_tcp_congestion(struct m= ptcp_sock *msk, sockptr_t =20 cap_net_admin =3D sockopt_ns_capable(sock_net(sk)->user_ns, CAP_NET_ADMIN= ); =20 + if (has_current_bpf_ctx()) + return -EOPNOTSUPP; + ret =3D 0; sockopt_lock_sock(sk); sockopt_seq_inc(msk); @@ -629,6 +641,9 @@ static int __mptcp_setsockopt_set_val(struct mptcp_sock= *msk, int max, 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; @@ -652,6 +667,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) { @@ -672,6 +690,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) { @@ -739,6 +760,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) @@ -1642,6 +1666,9 @@ int mptcp_set_rcvlowat(struct sock *sk, int val) if (space <=3D sk->sk_rcvbuf) return 0; =20 + if (has_current_bpf_ctx()) + return -EOPNOTSUPP; + /* propagate the rcvbuf changes to all the subflows */ WRITE_ONCE(sk->sk_rcvbuf, space); mptcp_for_each_subflow(mptcp_sk(sk), subflow) { --=20 2.43.0 From nobody Mon May 25 04:19:37 2026 Received: from out-174.mta1.migadu.com (out-174.mta1.migadu.com [95.215.58.174]) (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 CBB4E34B410 for ; Fri, 22 May 2026 09:12:57 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=95.215.58.174 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1779441179; cv=none; b=Bbhqw5u5UyYLDH0OOWNSMjvHGRp7vZPCMnGyYQ9CRlF0/j3HRwt2J5s7J+EOObFOawms7LGNWd8oSClGapmoZ+UiWi9q0Y0xRwXWgMzDyioDe4hYkU5rENbseCDlsq52yRuXhd0SxVIy43y5ZzNPSTQtgCbgUh0UKOVh0SZjKS4= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1779441179; c=relaxed/simple; bh=b+GkrD/fE3PGw1UslW8/3v+ndC81wrvLrIlPWqcHdBY=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=Xrhx8npyux84BDnz+dOXahrX0f8oax82hoFFwmDi19Ye9kCMMj7SU0tiGgC48HeOUVJMXW9JF0S2mSGEFnQcZNmUoqagDTV7tBoRCQFpswWF5iJJye8VtWsbWGJP2yLndbOnuobp4bdApLHKNbtl2e1Y948uDwsonOalKz5692I= 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=WN+1BexZ; arc=none smtp.client-ip=95.215.58.174 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="WN+1BexZ" 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=1779441176; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=xgeqPp3TSnsvJJ/vieW3dq7Z1PGrkpWsJyAYupzn6p4=; b=WN+1BexZp7wdCQt8d7/TYdGxmnaSW27s5OJMMLA3MXmCoZtXDn3S2EFig9Oqj33TMsoDkS 0Wjwgh0ictFcxAwMIy43gdUOpbqqTgU/9K0z0n7QGeiiyJlNocZIWAH3cue+PzWMycvO8t /+cApo1xYrGCi+q44V6qLyjF2RZs/BU= From: Gang Yan Date: Fri, 22 May 2026 17:12:35 +0800 Subject: [PATCH mptcp-next v5 5/6] DO-NOT-MERGE: mptcp: allow set some sockopt in BPF context Precedence: bulk X-Mailing-List: mptcp@lists.linux.dev List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20260522-sockopt_lock-v5-5-108629a46e98@kylinos.cn> References: <20260522-sockopt_lock-v5-0-108629a46e98@kylinos.cn> In-Reply-To: <20260522-sockopt_lock-v5-0-108629a46e98@kylinos.cn> To: MPTCP Linux Cc: Gang Yan , pabeni@redhat.com X-Migadu-Flow: FLOW_OUT From: Gang Yan When a cgroup/setsockopt BPF program calls bpf_setsockopt() on an MPTCP socket, __bpf_setsockopt() currently handles the option through sol_socket_sockopt()/sol_tcp_sockopt()/sol_ip_sockopt() directly, bypassing the MPTCP setsockopt handler entirely. This means options are applied to the msk only, without being propagated to first ssk. Signed-off-by: Gang Yan --- net/core/filter.c | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/net/core/filter.c b/net/core/filter.c index 80a3b702a2d4..bfcfc8901b48 100644 --- a/net/core/filter.c +++ b/net/core/filter.c @@ -5591,6 +5591,12 @@ static int __bpf_setsockopt(struct sock *sk, int lev= el, int optname, { if (!sk_fullsock(sk)) return -EINVAL; + if (sk->sk_protocol =3D=3D IPPROTO_MPTCP) { + struct socket *sock =3D sk->sk_socket; + + return sock->ops->setsockopt(sock, level, optname, + KERNEL_SOCKPTR(optval), optlen); + } =20 if (level =3D=3D SOL_SOCKET) return sol_socket_sockopt(sk, optname, optval, &optlen, false); --=20 2.43.0 From nobody Mon May 25 04:19:37 2026 Received: from out-171.mta1.migadu.com (out-171.mta1.migadu.com [95.215.58.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 CF4503B95EC for ; Fri, 22 May 2026 09:12:58 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=95.215.58.171 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1779441180; cv=none; b=Epknji+Jm96yKBzzcCmBsrM0pNArmOJSefdqmxLMKPzeTMjYtXhwnF/xb0OCX/v8HjNv8SjyMm/0fWUL14G8Qij4rGphgd3mBhRnlqyQvjh28p8Jd1k82pjqJ7aYAWBaEChvco6nnd0hthuUPV64Clt+pctOtpTTERSqjsSIA9I= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1779441180; c=relaxed/simple; bh=PTkef1vyPUBbGN0Ya64G2dNXajS5t+xMqyed5QbytEU=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=bU5QqB9ucZjkY0tdi0MdpnALg/7zKfgAXdRzbJ38DnbdDzBvbr/TGiO5C64utRoAudvB7zZ2PuKX4aTIjOQOwmNVqWECTDxE41h0TAWsFmWr9cXmi+AXflqArSeQfxDuUkZeCn9O04sqjiHPkIeMesIPInqEr1syWpP2gOgR5+A= 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=aAdGW5AE; arc=none smtp.client-ip=95.215.58.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="aAdGW5AE" 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=1779441177; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=IWAWh/3JIuSfqrJGjmUiaJGIuqZS/9EWg8ezwclaPgM=; b=aAdGW5AEqJua3OaLccwekXGBzAhtITNcdgh7299ysAkQY3slWHl8O4CVXSFQD3KftYvFuJ I6A2YoDTWVGC9snuPs5bnrCLsVSF7fNsgA6D/PkcliSsMBOIUeZ8vzhRPBUjdzSFCG2IWi lDE2TUkHrMGie4XLaHPaHXTbrc13Ojc= From: Gang Yan Date: Fri, 22 May 2026 17:12:36 +0800 Subject: [PATCH mptcp-next v5 6/6] DO-NOT-MERGE: selftest: bpf: set mptcp sockopt in BPF context Precedence: bulk X-Mailing-List: mptcp@lists.linux.dev List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20260522-sockopt_lock-v5-6-108629a46e98@kylinos.cn> References: <20260522-sockopt_lock-v5-0-108629a46e98@kylinos.cn> In-Reply-To: <20260522-sockopt_lock-v5-0-108629a46e98@kylinos.cn> To: MPTCP Linux Cc: Gang Yan , pabeni@redhat.com X-Migadu-Flow: FLOW_OUT From: Gang Yan Add a test to verify that bpf_setsockopt() called from a cgroup/setsockopt BPF program on an MPTCP socket correctly returns -EOPNOTSUPP when the target option requires subflow-level locking. Assisted-by: Claude:glm-5.1 Signed-off-by: Gang Yan --- tools/testing/selftests/bpf/prog_tests/mptcp.c | 64 +++++++++++++++++++ .../testing/selftests/bpf/progs/mptcp_setsockopt.c | 71 ++++++++++++++++++= ++++ 2 files changed, 135 insertions(+) diff --git a/tools/testing/selftests/bpf/prog_tests/mptcp.c b/tools/testing= /selftests/bpf/prog_tests/mptcp.c index 7f48fd9e94e1..e6b0f5ed3ff0 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,67 @@ 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 map_fd, err; + __s32 val =3D 1024 * 1024, result; + __u32 key =3D 0; + + 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; + + err =3D bpf_prog_attach(bpf_program__fd(skel->progs.mptcp_setsockopt), + cgroup_fd, BPF_CGROUP_SETSOCKOPT, 0); + if (!ASSERT_OK(err, "bpf_prog_attach")) + 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; + + /* Trigger cgroup/setsockopt BPF program by calling setsockopt. + * The BPF program calls bpf_setsockopt(sk, SO_RCVLOWAT, ...) which + * reaches mptcp_set_rcvlowat(). There has_current_bpf_ctx() is true, + * so it should return -EOPNOTSUPP. + */ + err =3D setsockopt(client_fd, SOL_SOCKET, SO_RCVLOWAT, &val, sizeof(val)); + ASSERT_OK(err, "setsockopt(SO_RCVLOWAT)"); + + map_fd =3D bpf_map__fd(skel->maps.results); + err =3D bpf_map_lookup_elem(map_fd, &key, &result); + if (!ASSERT_OK(err, "bpf_map_lookup_elem")) + goto close_client; + + ASSERT_EQ(result, -EOPNOTSUPP, "bpf_setsockopt(SO_RCVLOWAT)"); + +close_client: + 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 +897,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..4c14c59bd03d --- /dev/null +++ b/tools/testing/selftests/bpf/progs/mptcp_setsockopt.c @@ -0,0 +1,71 @@ +// SPDX-License-Identifier: GPL-2.0 +/* Copyright (c) 2025, SUSE. */ + +/* Test that bpf_setsockopt() called from a cgroup/setsockopt BPF program + * on an MPTCP socket returns -EOPNOTSUPP when the target option requires + * subflow-level locking (e.g. SO_RCVLOWAT via mptcp_set_rcvlowat). + * + * Flow: + * userspace: setsockopt(mptcp_fd, SOL_SOCKET, SO_RCVLOWAT, &large_val, = ...) + * -> do_sock_setsockopt() + * -> BPF_CGROUP_RUN_PROG_SETSOCKOPT(sk) // sk =3D MPTCP meta so= cket + * BPF prog: read val from ctx->optval, + * bpf_setsockopt(sk, SOL_SOCKET, SO_RCVLOWAT, &val, 4) + * -> sk_setsockopt() + * -> ops->set_rcvlowat =3D mptcp_set_rcvlowat() + * -> has_current_bpf_ctx() =3D=3D true + * -> return -EOPNOTSUPP + */ + +#include "bpf_tracing_net.h" +#include + +#ifndef IPPROTO_MPTCP +#define IPPROTO_MPTCP 262 +#endif + +struct { + __uint(type, BPF_MAP_TYPE_ARRAY); + __uint(max_entries, 1); + __type(key, __u32); + __type(value, __s32); +} results SEC(".maps"); + +SEC("cgroup/setsockopt") +int mptcp_setsockopt(struct bpf_sockopt *ctx) +{ + struct bpf_sock *sk =3D ctx->sk; + __s32 val, ret; + __u32 key =3D 0; + + /* Only interested in MPTCP + SO_RCVLOWAT */ + if (!sk || sk->protocol !=3D IPPROTO_MPTCP) + return 1; + + if (ctx->level !=3D SOL_SOCKET || ctx->optname !=3D SO_RCVLOWAT) + return 1; + + /* Read value from ctx, verifier needs bounds check. + * Save optval pointer to local var so the verifier tracks + * the same register through bounds check and dereference. + */ + void *optval =3D ctx->optval; + + if (ctx->optlen < sizeof(val)) + return 1; + if (optval + sizeof(val) > ctx->optval_end) + return 1; + val =3D *(__s32 *)optval; + + /* Forward the setsockopt via bpf_setsockopt. + * This reaches mptcp_set_rcvlowat() which checks has_current_bpf_ctx() + * and should return -EOPNOTSUPP. + */ + ret =3D bpf_setsockopt(sk, SOL_SOCKET, SO_RCVLOWAT, &val, sizeof(val)); + bpf_map_update_elem(&results, &key, &ret, BPF_ANY); + + /* BPF handled this, don't invoke kernel handler */ + return 1; +} + +char _license[] SEC("license") =3D "GPL"; --=20 2.43.0