diff mbox series

[net-next] net: bpf: Use sockopt_lock_sock() in ip_sock_set_tos()

Message ID 20231027182424.1444845-1-yonghong.song@linux.dev (mailing list archive)
State Accepted
Commit 06497763c8f15d08c0e356e651a61f2930a8987c
Delegated to: Netdev Maintainers
Headers show
Series [net-next] net: bpf: Use sockopt_lock_sock() in ip_sock_set_tos() | expand

Checks

Context Check Description
netdev/series_format success Single patches do not need cover letters
netdev/tree_selection success Clearly marked for net-next
netdev/fixes_present success Fixes tag not required for -next series
netdev/header_inline success No static functions without inline keyword in header files
netdev/build_32bit success Errors and warnings before: 1364 this patch: 1364
netdev/cc_maintainers fail 1 blamed authors not CCed: pabeni@redhat.com; 4 maintainers not CCed: dsahern@kernel.org pabeni@redhat.com davem@davemloft.net kuba@kernel.org
netdev/build_clang fail Errors and warnings before: 15 this patch: 15
netdev/verify_signedoff success Signed-off-by tag matches author and committer
netdev/deprecated_api success None detected
netdev/check_selftest success No net selftest shell script
netdev/verify_fixes success Fixes tag looks correct
netdev/build_allmodconfig_warn success Errors and warnings before: 1389 this patch: 1389
netdev/checkpatch success total: 0 errors, 0 warnings, 0 checks, 11 lines checked
netdev/build_clang_rust success Link
netdev/kdoc success Errors and warnings before: 0 this patch: 0
netdev/source_inline success Was 0 now: 0

Commit Message

Yonghong Song Oct. 27, 2023, 6:24 p.m. UTC
With latest sync from net-next tree, bpf-next has a bpf selftest failure:
  [root@arch-fb-vm1 bpf]# ./test_progs -t setget_sockopt
  ...
  [   76.194349] ============================================
  [   76.194682] WARNING: possible recursive locking detected
  [   76.195039] 6.6.0-rc7-g37884503df08-dirty #67 Tainted: G        W  OE
  [   76.195518] --------------------------------------------
  [   76.195852] new_name/154 is trying to acquire lock:
  [   76.196159] ffff8c3e06ad8d30 (sk_lock-AF_INET){+.+.}-{0:0}, at: ip_sock_set_tos+0x19/0x30
  [   76.196669]
  [   76.196669] but task is already holding lock:
  [   76.197028] ffff8c3e06ad8d30 (sk_lock-AF_INET){+.+.}-{0:0}, at: inet_listen+0x21/0x70
  [   76.197517]
  [   76.197517] other info that might help us debug this:
  [   76.197919]  Possible unsafe locking scenario:
  [   76.197919]
  [   76.198287]        CPU0
  [   76.198444]        ----
  [   76.198600]   lock(sk_lock-AF_INET);
  [   76.198831]   lock(sk_lock-AF_INET);
  [   76.199062]
  [   76.199062]  *** DEADLOCK ***
  [   76.199062]
  [   76.199420]  May be due to missing lock nesting notation
  [   76.199420]
  [   76.199879] 2 locks held by new_name/154:
  [   76.200131]  #0: ffff8c3e06ad8d30 (sk_lock-AF_INET){+.+.}-{0:0}, at: inet_listen+0x21/0x70
  [   76.200644]  #1: ffffffff90f96a40 (rcu_read_lock){....}-{1:2}, at: __cgroup_bpf_run_filter_sock_ops+0x55/0x290
  [   76.201268]
  [   76.201268] stack backtrace:
  [   76.201538] CPU: 4 PID: 154 Comm: new_name Tainted: G        W  OE      6.6.0-rc7-g37884503df08-dirty #67
  [   76.202134] Hardware name: QEMU Standard PC (i440FX + PIIX, 1996), BIOS 1.13.0-1ubuntu1.1 04/01/2014
  [   76.202699] Call Trace:
  [   76.202858]  <TASK>
  [   76.203002]  dump_stack_lvl+0x4b/0x80
  [   76.203239]  __lock_acquire+0x740/0x1ec0
  [   76.203503]  lock_acquire+0xc1/0x2a0
  [   76.203766]  ? ip_sock_set_tos+0x19/0x30
  [   76.204050]  ? sk_stream_write_space+0x12a/0x230
  [   76.204389]  ? lock_release+0xbe/0x260
  [   76.204661]  lock_sock_nested+0x32/0x80
  [   76.204942]  ? ip_sock_set_tos+0x19/0x30
  [   76.205208]  ip_sock_set_tos+0x19/0x30
  [   76.205452]  do_ip_setsockopt+0x4b3/0x1580
  [   76.205719]  __bpf_setsockopt+0x62/0xa0
  [   76.205963]  bpf_sock_ops_setsockopt+0x11/0x20
  [   76.206247]  bpf_prog_630217292049c96e_bpf_test_sockopt_int+0xbc/0x123
  [   76.206660]  bpf_prog_493685a3bae00bbd_bpf_test_ip_sockopt+0x49/0x4b
  [   76.207055]  bpf_prog_b0bcd27f269aeea0_skops_sockopt+0x44c/0xec7
  [   76.207437]  __cgroup_bpf_run_filter_sock_ops+0xda/0x290
  [   76.207829]  __inet_listen_sk+0x108/0x1b0
  [   76.208122]  inet_listen+0x48/0x70
  [   76.208373]  __sys_listen+0x74/0xb0
  [   76.208630]  __x64_sys_listen+0x16/0x20
  [   76.208911]  do_syscall_64+0x3f/0x90
  [   76.209174]  entry_SYSCALL_64_after_hwframe+0x6e/0xd8
  ...

Both ip_sock_set_tos() and inet_listen() calls lock_sock(sk) which
caused a dead lock.

To fix the issue, use sockopt_lock_sock() in ip_sock_set_tos()
instead. sockopt_lock_sock() will avoid lock_sock() if it is in bpf
context.

Fixes: 878d951c6712 ("inet: lock the socket in ip_sock_set_tos()")
Cc: Eric Dumazet <edumazet@google.com>
Suggested-by: Martin KaFai Lau <martin.lau@kernel.org>
Signed-off-by: Yonghong Song <yonghong.song@linux.dev>
---
 net/ipv4/ip_sockglue.c | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

Comments

Eric Dumazet Oct. 27, 2023, 6:42 p.m. UTC | #1
On Fri, Oct 27, 2023 at 8:24 PM Yonghong Song <yonghong.song@linux.dev> wrote:
>
> With latest sync from net-next tree, bpf-next has a bpf selftest failure:
>   [root@arch-fb-vm1 bpf]# ./test_progs -t setget_sockopt
>   ...
>   [   76.194349] ============================================
>   ...
>
> Both ip_sock_set_tos() and inet_listen() calls lock_sock(sk) which
> caused a dead lock.
>
> To fix the issue, use sockopt_lock_sock() in ip_sock_set_tos()
> instead. sockopt_lock_sock() will avoid lock_sock() if it is in bpf
> context.
>
> Fixes: 878d951c6712 ("inet: lock the socket in ip_sock_set_tos()")
> Cc: Eric Dumazet <edumazet@google.com>
> Suggested-by: Martin KaFai Lau <martin.lau@kernel.org>
> Signed-off-by: Yonghong Song <yonghong.song@linux.dev>
> ---

SGTM, thanks.

Reviewed-by: Eric Dumazet <edumazet@google.com>
patchwork-bot+netdevbpf@kernel.org Oct. 27, 2023, 11 p.m. UTC | #2
Hello:

This patch was applied to netdev/net-next.git (main)
by Jakub Kicinski <kuba@kernel.org>:

On Fri, 27 Oct 2023 11:24:24 -0700 you wrote:
> With latest sync from net-next tree, bpf-next has a bpf selftest failure:
>   [root@arch-fb-vm1 bpf]# ./test_progs -t setget_sockopt
>   ...
>   [   76.194349] ============================================
>   [   76.194682] WARNING: possible recursive locking detected
>   [   76.195039] 6.6.0-rc7-g37884503df08-dirty #67 Tainted: G        W  OE
>   [   76.195518] --------------------------------------------
>   [   76.195852] new_name/154 is trying to acquire lock:
>   [   76.196159] ffff8c3e06ad8d30 (sk_lock-AF_INET){+.+.}-{0:0}, at: ip_sock_set_tos+0x19/0x30
>   [   76.196669]
>   [   76.196669] but task is already holding lock:
>   [   76.197028] ffff8c3e06ad8d30 (sk_lock-AF_INET){+.+.}-{0:0}, at: inet_listen+0x21/0x70
>   [   76.197517]
>   [   76.197517] other info that might help us debug this:
>   [   76.197919]  Possible unsafe locking scenario:
>   [   76.197919]
>   [   76.198287]        CPU0
>   [   76.198444]        ----
>   [   76.198600]   lock(sk_lock-AF_INET);
>   [   76.198831]   lock(sk_lock-AF_INET);
>   [   76.199062]
>   [   76.199062]  *** DEADLOCK ***
>   [   76.199062]
>   [   76.199420]  May be due to missing lock nesting notation
>   [   76.199420]
>   [   76.199879] 2 locks held by new_name/154:
>   [   76.200131]  #0: ffff8c3e06ad8d30 (sk_lock-AF_INET){+.+.}-{0:0}, at: inet_listen+0x21/0x70
>   [   76.200644]  #1: ffffffff90f96a40 (rcu_read_lock){....}-{1:2}, at: __cgroup_bpf_run_filter_sock_ops+0x55/0x290
>   [   76.201268]
>   [   76.201268] stack backtrace:
>   [   76.201538] CPU: 4 PID: 154 Comm: new_name Tainted: G        W  OE      6.6.0-rc7-g37884503df08-dirty #67
>   [   76.202134] Hardware name: QEMU Standard PC (i440FX + PIIX, 1996), BIOS 1.13.0-1ubuntu1.1 04/01/2014
>   [   76.202699] Call Trace:
>   [   76.202858]  <TASK>
>   [   76.203002]  dump_stack_lvl+0x4b/0x80
>   [   76.203239]  __lock_acquire+0x740/0x1ec0
>   [   76.203503]  lock_acquire+0xc1/0x2a0
>   [   76.203766]  ? ip_sock_set_tos+0x19/0x30
>   [   76.204050]  ? sk_stream_write_space+0x12a/0x230
>   [   76.204389]  ? lock_release+0xbe/0x260
>   [   76.204661]  lock_sock_nested+0x32/0x80
>   [   76.204942]  ? ip_sock_set_tos+0x19/0x30
>   [   76.205208]  ip_sock_set_tos+0x19/0x30
>   [   76.205452]  do_ip_setsockopt+0x4b3/0x1580
>   [   76.205719]  __bpf_setsockopt+0x62/0xa0
>   [   76.205963]  bpf_sock_ops_setsockopt+0x11/0x20
>   [   76.206247]  bpf_prog_630217292049c96e_bpf_test_sockopt_int+0xbc/0x123
>   [   76.206660]  bpf_prog_493685a3bae00bbd_bpf_test_ip_sockopt+0x49/0x4b
>   [   76.207055]  bpf_prog_b0bcd27f269aeea0_skops_sockopt+0x44c/0xec7
>   [   76.207437]  __cgroup_bpf_run_filter_sock_ops+0xda/0x290
>   [   76.207829]  __inet_listen_sk+0x108/0x1b0
>   [   76.208122]  inet_listen+0x48/0x70
>   [   76.208373]  __sys_listen+0x74/0xb0
>   [   76.208630]  __x64_sys_listen+0x16/0x20
>   [   76.208911]  do_syscall_64+0x3f/0x90
>   [   76.209174]  entry_SYSCALL_64_after_hwframe+0x6e/0xd8
>   ...
> 
> [...]

Here is the summary with links:
  - [net-next] net: bpf: Use sockopt_lock_sock() in ip_sock_set_tos()
    https://git.kernel.org/netdev/net-next/c/06497763c8f1

You are awesome, thank you!
diff mbox series

Patch

diff --git a/net/ipv4/ip_sockglue.c b/net/ipv4/ip_sockglue.c
index 9c68b6b74d9f..2efc53526a38 100644
--- a/net/ipv4/ip_sockglue.c
+++ b/net/ipv4/ip_sockglue.c
@@ -602,9 +602,9 @@  void __ip_sock_set_tos(struct sock *sk, int val)
 
 void ip_sock_set_tos(struct sock *sk, int val)
 {
-	lock_sock(sk);
+	sockopt_lock_sock(sk);
 	__ip_sock_set_tos(sk, val);
-	release_sock(sk);
+	sockopt_release_sock(sk);
 }
 EXPORT_SYMBOL(ip_sock_set_tos);