• subashab@codeaurora.org's avatar
    ipv6: addrconf: Fix recursive spin lock call · 9f88ecf6
    subashab@codeaurora.org authored
    [ Upstream commit 16186a82 ]
    
    A rcu stall with the following backtrace was seen on a system with
    forwarding, optimistic_dad and use_optimistic set. To reproduce,
    set these flags and allow ipv6 autoconf.
    
    This occurs because the device write_lock is acquired while already
    holding the read_lock. Back trace below -
    
    INFO: rcu_preempt self-detected stall on CPU { 1}  (t=2100 jiffies
     g=3992 c=3991 q=4471)
    <6> Task dump for CPU 1:
    <2> kworker/1:0     R  running task    12168    15   2 0x00000002
    <2> Workqueue: ipv6_addrconf addrconf_dad_work
    <6> Call trace:
    <2> [<ffffffc000084da8>] el1_irq+0x68/0xdc
    <2> [<ffffffc000cc4e0c>] _raw_write_lock_bh+0x20/0x30
    <2> [<ffffffc000bc5dd8>] __ipv6_dev_ac_inc+0x64/0x1b4
    <2> [<ffffffc000bcbd2c>] addrconf_join_anycast+0x9c/0xc4
    <2> [<ffffffc000bcf9f0>] __ipv6_ifa_notify+0x160/0x29c
    <2> [<ffffffc000bcfb7c>] ipv6_ifa_notify+0x50/0x70
    <2> [<ffffffc000bd035c>] addrconf_dad_work+0x314/0x334
    <2> [<ffffffc0000b64c8>] process_one_work+0x244/0x3fc
    <2> [<ffffffc0000b7324>] worker_thread+0x2f8/0x418
    <2> [<ffffffc0000bb40c>] kthread+0xe0/0xec
    
    v2: do addrconf_dad_kick inside read lock and then acquire write
    lock for ipv6_ifa_notify as suggested by Eric
    
    Fixes: 7fd2561e ("net: ipv6: Add a sysctl to make optimistic
    addresses useful candidates")
    
    Cc: Eric Dumazet <edumazet@google.com>
    Cc: Erik Kline <ek@google.com>
    Cc: Hannes Frederic Sowa <hannes@stressinduktion.org>
    Signed-off-by: default avatarSubash Abhinov Kasiviswanathan <subashab@codeaurora.org>
    Acked-by: default avatarHannes Frederic Sowa <hannes@stressinduktion.org>
    Acked-by: default avatarEric Dumazet <edumazet@google.com>
    Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
    Signed-off-by: default avatarSasha Levin <sasha.levin@oracle.com>
    9f88ecf6
addrconf.c 141 KB