• Ido Schimmel's avatar
    vrf: Fix lockdep splat in output path · 2033ab90
    Ido Schimmel authored
    Cited commit converted the neighbour code to use the standard RCU
    variant instead of the RCU-bh variant, but the VRF code still uses
    rcu_read_lock_bh() / rcu_read_unlock_bh() around the neighbour lookup
    code in its IPv4 and IPv6 output paths, resulting in lockdep splats
    [1][2]. Can be reproduced using [3].
    
    Fix by switching to rcu_read_lock() / rcu_read_unlock().
    
    [1]
    =============================
    WARNING: suspicious RCU usage
    6.5.0-rc1-custom-g9c099e6dbf98 #403 Not tainted
    -----------------------------
    include/net/neighbour.h:302 suspicious rcu_dereference_check() usage!
    
    other info that might help us debug this:
    
    rcu_scheduler_active = 2, debug_locks = 1
    2 locks held by ping/183:
     #0: ffff888105ea1d80 (sk_lock-AF_INET){+.+.}-{0:0}, at: raw_sendmsg+0xc6c/0x33c0
     #1: ffffffff85b46820 (rcu_read_lock_bh){....}-{1:2}, at: vrf_output+0x2e3/0x2030
    
    stack backtrace:
    CPU: 0 PID: 183 Comm: ping Not tainted 6.5.0-rc1-custom-g9c099e6dbf98 #403
    Hardware name: QEMU Standard PC (i440FX + PIIX, 1996), BIOS 1.16.2-1.fc37 04/01/2014
    Call Trace:
     <TASK>
     dump_stack_lvl+0xc1/0xf0
     lockdep_rcu_suspicious+0x211/0x3b0
     vrf_output+0x1380/0x2030
     ip_push_pending_frames+0x125/0x2a0
     raw_sendmsg+0x200d/0x33c0
     inet_sendmsg+0xa2/0xe0
     __sys_sendto+0x2aa/0x420
     __x64_sys_sendto+0xe5/0x1c0
     do_syscall_64+0x38/0x80
     entry_SYSCALL_64_after_hwframe+0x63/0xcd
    
    [2]
    =============================
    WARNING: suspicious RCU usage
    6.5.0-rc1-custom-g9c099e6dbf98 #403 Not tainted
    -----------------------------
    include/net/neighbour.h:302 suspicious rcu_dereference_check() usage!
    
    other info that might help us debug this:
    
    rcu_scheduler_active = 2, debug_locks = 1
    2 locks held by ping6/182:
     #0: ffff888114b63000 (sk_lock-AF_INET6){+.+.}-{0:0}, at: rawv6_sendmsg+0x1602/0x3e50
     #1: ffffffff85b46820 (rcu_read_lock_bh){....}-{1:2}, at: vrf_output6+0xe9/0x1310
    
    stack backtrace:
    CPU: 0 PID: 182 Comm: ping6 Not tainted 6.5.0-rc1-custom-g9c099e6dbf98 #403
    Hardware name: QEMU Standard PC (i440FX + PIIX, 1996), BIOS 1.16.2-1.fc37 04/01/2014
    Call Trace:
     <TASK>
     dump_stack_lvl+0xc1/0xf0
     lockdep_rcu_suspicious+0x211/0x3b0
     vrf_output6+0xd32/0x1310
     ip6_local_out+0xb4/0x1a0
     ip6_send_skb+0xbc/0x340
     ip6_push_pending_frames+0xe5/0x110
     rawv6_sendmsg+0x2e6e/0x3e50
     inet_sendmsg+0xa2/0xe0
     __sys_sendto+0x2aa/0x420
     __x64_sys_sendto+0xe5/0x1c0
     do_syscall_64+0x38/0x80
     entry_SYSCALL_64_after_hwframe+0x63/0xcd
    
    [3]
    #!/bin/bash
    
    ip link add name vrf-red up numtxqueues 2 type vrf table 10
    ip link add name swp1 up master vrf-red type dummy
    ip address add 192.0.2.1/24 dev swp1
    ip address add 2001:db8:1::1/64 dev swp1
    ip neigh add 192.0.2.2 lladdr 00:11:22:33:44:55 nud perm dev swp1
    ip neigh add 2001:db8:1::2 lladdr 00:11:22:33:44:55 nud perm dev swp1
    ip vrf exec vrf-red ping 192.0.2.2 -c 1 &> /dev/null
    ip vrf exec vrf-red ping6 2001:db8:1::2 -c 1 &> /dev/null
    
    Fixes: 09eed119 ("neighbour: switch to standard rcu, instead of rcu_bh")
    Reported-by: default avatarNaresh Kamboju <naresh.kamboju@linaro.org>
    Link: https://lore.kernel.org/netdev/CA+G9fYtEr-=GbcXNDYo3XOkwR+uYgehVoDjsP0pFLUpZ_AZcyg@mail.gmail.com/Signed-off-by: default avatarIdo Schimmel <idosch@nvidia.com>
    Reviewed-by: default avatarDavid Ahern <dsahern@kernel.org>
    Reviewed-by: default avatarEric Dumazet <edumazet@google.com>
    Link: https://lore.kernel.org/r/20230715153605.4068066-1-idosch@nvidia.comSigned-off-by: default avatarPaolo Abeni <pabeni@redhat.com>
    2033ab90
vrf.c 46.9 KB