From nobody Mon May 25 03:36:54 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 82E0A3C277F for ; Wed, 6 May 2026 10:34:24 +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=1778063666; cv=none; b=LGJSmMvnlyVVC+GP4LVi/uYKWvOOzHBqgzrYDDKUoBZmQ7GGlsnu6dyD++VYI8S3S3YJevBl1uztunrYA7mViYTeoMRvMGyF21qDbS6HE6A1okodbhOjTUKSiKSWeXvePZF4KAUvE79iJ69OJgL8w3a8c66Nd5KlKwGAlpdN1jQ= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1778063666; c=relaxed/simple; bh=HTKzHKu77xOopIWy2SlztXmWjwz2LKAbTuxcagqL+VM=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=o9nyZT8jCv2NKiPCpQJYo3SsXRAsLuaDiXG+xPVej9y75xguFen1svuBxjChC1LuoyKBgGpaZVe39Tb5dhegdo8LR3XTNW099okkoJED2ERGGck2W/XsF6b19J7VcvJvQLjgKL3GWAAsPNi/chqgugQTLaug8JL3Hh27I+GT2gs= 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=td2NGEkw; 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="td2NGEkw" 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=1778063662; 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=FmcaNR3XIftnFnCmmRr38PwDVgpvJOBmYJc3kxUeUOM=; b=td2NGEkwMve0Bgxk0QsZ500Ujpyj3fIhCEg+IheRUO3s0rI50x2oin9VSwuJ0m6HZMxfB3 NyP50tqqZ++Z9Io2uhwWrAFm5jKs1FIllhWHGSKrzdNtSESuEBwVcvlA/UNDFYXRerc2+2 xGFdQZMPTedUPgD2pDdM0WCiX+J4wjs= From: Gang Yan Date: Wed, 06 May 2026 18:33:54 +0800 Subject: [PATCH mptcp-net v3 1/2] 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: <20260506-sockopt_lock-v3-1-06bd417c6d63@kylinos.cn> References: <20260506-sockopt_lock-v3-0-06bd417c6d63@kylinos.cn> In-Reply-To: <20260506-sockopt_lock-v3-0-06bd417c6d63@kylinos.cn> To: MPTCP Linux Cc: Gang Yan X-Migadu-Flow: FLOW_OUT From: Gang Yan TCP and the core socket layer all use sockopt_lock_sock() sockopt_release_sock() in their setsockopt and getsockopt handlers. It is a BPF-aware wrapper that skips lock acquisition when invoked from a BPF program, where the socket lock is already held. Using lock_sock_fast() on subflows requires extra care: the fast path holds the socket spinlock with BH disabled, creating an atomic context where sleeping is not allowed. Switching to sockopt_lock_sock() avoids the risk of accidentally introducing sleeping operations inside the lock_sock_fast() critical section. Fixes: 24426654ed3a ("bpf: net: Avoid sk_setsockopt() taking sk lock when c= alled from bpf") Signed-off-by: Gang Yan --- net/mptcp/sockopt.c | 121 ++++++++++++++++++++++++++----------------------= ---- 1 file changed, 60 insertions(+), 61 deletions(-) diff --git a/net/mptcp/sockopt.c b/net/mptcp/sockopt.c index 1cf608e7357b..552e07296b38 100644 --- a/net/mptcp/sockopt.c +++ b/net/mptcp/sockopt.c @@ -72,12 +72,12 @@ static void mptcp_sol_socket_sync_intval(struct mptcp_s= ock *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) { struct sock *ssk =3D mptcp_subflow_tcp_sock(subflow); - bool slow =3D lock_sock_fast(ssk); + sockopt_lock_sock(ssk); =20 switch (optname) { case SO_DEBUG: @@ -114,10 +114,10 @@ static void mptcp_sol_socket_sync_intval(struct mptcp= _sock *msk, int optname, in } =20 subflow->setsockopt_seq =3D msk->setsockopt_seq; - unlock_sock_fast(ssk, slow); + sockopt_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,16 +156,16 @@ static int mptcp_setsockopt_sol_socket_tstamp(struct = mptcp_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 - lock_sock(ssk); + sockopt_lock_sock(ssk); sock_set_timestamp(ssk, optname, !!val); - release_sock(ssk); + sockopt_release_sock(ssk); } =20 - release_sock(sk); + sockopt_release_sock(sk); return 0; } =20 @@ -231,17 +231,17 @@ static int mptcp_setsockopt_sol_socket_timestamping(s= truct 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); =20 - lock_sock(ssk); + sockopt_lock_sock(ssk); sock_set_timestamping(ssk, optname, timestamping); - release_sock(ssk); + sockopt_release_sock(ssk); } =20 - release_sock(sk); + sockopt_release_sock(sk); =20 return 0; } @@ -266,11 +266,11 @@ static int mptcp_setsockopt_sol_socket_linger(struct = mptcp_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); - bool slow =3D lock_sock_fast(ssk); + sockopt_lock_sock(ssk); =20 if (!ling.l_onoff) { sock_reset_flag(ssk, SOCK_LINGER); @@ -280,10 +280,10 @@ static int mptcp_setsockopt_sol_socket_linger(struct = mptcp_sock *msk, sockptr_t } =20 subflow->setsockopt_seq =3D msk->setsockopt_seq; - unlock_sock_fast(ssk, slow); + sockopt_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,24 +601,24 @@ static int mptcp_setsockopt_sol_tcp_congestion(struct= mptcp_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); int err; =20 - lock_sock(ssk); + sockopt_lock_sock(ssk); err =3D tcp_set_congestion_control(ssk, name, true, cap_net_admin); if (err < 0 && ret =3D=3D 0) ret =3D err; subflow->setsockopt_seq =3D msk->setsockopt_seq; - release_sock(ssk); + sockopt_release_sock(ssk); } =20 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 @@ -633,10 +633,10 @@ static int __mptcp_setsockopt_set_val(struct mptcp_so= ck *msk, int max, struct sock *ssk =3D mptcp_subflow_tcp_sock(subflow); int ret; =20 - lock_sock(ssk); + sockopt_lock_sock(ssk); ret =3D set_val(ssk, val); err =3D err ? : ret; - release_sock(ssk); + sockopt_release_sock(ssk); } =20 if (!err) { @@ -657,9 +657,9 @@ static int __mptcp_setsockopt_sol_tcp_cork(struct mptcp= _sock *msk, int val) mptcp_for_each_subflow(msk, subflow) { struct sock *ssk =3D mptcp_subflow_tcp_sock(subflow); =20 - lock_sock(ssk); + sockopt_lock_sock(ssk); __tcp_sock_set_cork(ssk, !!val); - release_sock(ssk); + sockopt_release_sock(ssk); } if (!val) mptcp_check_and_set_pending(sk); @@ -677,9 +677,9 @@ static int __mptcp_setsockopt_sol_tcp_nodelay(struct mp= tcp_sock *msk, int val) mptcp_for_each_subflow(msk, subflow) { struct sock *ssk =3D mptcp_subflow_tcp_sock(subflow); =20 - lock_sock(ssk); + sockopt_lock_sock(ssk); __tcp_sock_set_nodelay(ssk, !!val); - release_sock(ssk); + sockopt_release_sock(ssk); } if (val) mptcp_check_and_set_pending(sk); @@ -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,18 +744,17 @@ static int mptcp_setsockopt_v4_set_tos(struct mptcp_s= ock *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) { struct sock *ssk =3D mptcp_subflow_tcp_sock(subflow); - bool slow; =20 - slow =3D lock_sock_fast(ssk); + sockopt_lock_sock(ssk); __ip_sock_set_tos(ssk, val); - unlock_sock_fast(ssk, slow); + sockopt_release_sock(ssk); } - release_sock(sk); + sockopt_release_sock(sk); =20 return 0; } @@ -784,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); @@ -794,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 @@ -846,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) @@ -889,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 @@ -913,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 @@ -938,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; @@ -953,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 @@ -1124,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); @@ -1137,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 @@ -1147,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 @@ -1216,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); @@ -1229,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 @@ -1239,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 @@ -1325,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; @@ -1355,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)) @@ -1364,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 @@ -1519,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 03:36:54 2026 Received: from out-186.mta1.migadu.com (out-186.mta1.migadu.com [95.215.58.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 A632835294E for ; Wed, 6 May 2026 10:34:26 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=95.215.58.186 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1778063668; cv=none; b=Tp4mGVfEQUzKKc5Tkd7R4rbcCFLBSoo57oG7nIeKjEZOWU6nnOVMel8YeQwoqBnM6RXLQ+C0EFOrs12ZvPSA5PXkTHYBVq/1/UpRm9G1cxVqhvXCDG1lJFXymbUXcfxwgVp5YUHb3kWrQIaO7EWoIrMczgoIGxjdNAXKQK30M+Q= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1778063668; c=relaxed/simple; bh=e1uR/rhFqyMDfcfrV9spJPg3ehMRMcThHOV3Gb3btE4=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=e5gBPOdWgaV5vpFcNK/Zc+EJfpYaB7lG4BxAx2J0tVk8Dmm+Ye7jz9Fk305GAqf0SCRHO9VRw2ioO10QQI0MMFx3LZGPpoD4atUtyidChFfFCd3K9ah8sYklJP9PR4tNwtgVCQE2J9E9YPIfHvkbdcRb7/p/jVBJg4GQ5y3UbdU= 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=ABGbXNkA; arc=none smtp.client-ip=95.215.58.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="ABGbXNkA" 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=1778063664; 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=7RTL/e0453AnaGgbMDI9xSPYBK/YN8km3RiD4o+RQu4=; b=ABGbXNkA2gVI91pbIS5eqPYMZyfyxTpAGnC2vGdV3le3EGsPo5vqO+fFq/q6VUkp5ZfkKL sfgrfMhfWOFKP9v0mBPsfCYVelvRhAXDq4uQfQpKY/oh5fq5qbm4z8486R6X5gH9JNULBz oM2XY1MCBoRRtJonnLaDA2Y/uLGhREo= From: Gang Yan Date: Wed, 06 May 2026 18:33:55 +0800 Subject: [PATCH mptcp-net v3 2/2] mptcp: use sockopt_ns_capable() in setsockopt 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: <20260506-sockopt_lock-v3-2-06bd417c6d63@kylinos.cn> References: <20260506-sockopt_lock-v3-0-06bd417c6d63@kylinos.cn> In-Reply-To: <20260506-sockopt_lock-v3-0-06bd417c6d63@kylinos.cn> To: MPTCP Linux Cc: Gang Yan 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. Fixes: e42c7beee71d ("bpf: net: Consider has_current_bpf_ctx() when testing= capable() in sk_setsockopt()") Signed-off-by: Gang Yan --- net/mptcp/sockopt.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/net/mptcp/sockopt.c b/net/mptcp/sockopt.c index 552e07296b38..059c386f427b 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); --=20 2.43.0