• Nikolay Aleksandrov's avatar
    bridge: disable softirqs around br_fdb_update to avoid lockup · 4845c537
    Nikolay Aleksandrov authored
    commit c4c832f8 upstream.
    
    br_fdb_update() can be called in process context in the following way:
    br_fdb_add() -> __br_fdb_add() -> br_fdb_update() (if NTF_USE flag is set)
    so we need to disable softirqs because there are softirq users of the
    hash_lock. One easy way to reproduce this is to modify the bridge utility
    to set NTF_USE, enable stp and then set maxageing to a low value so
    br_fdb_cleanup() is called frequently and then just add new entries in
    a loop. This happens because br_fdb_cleanup() is called from timer/softirq
    context. The spin locks in br_fdb_update were _bh before commit f8ae737d
    ("[BRIDGE]: forwarding remove unneeded preempt and bh diasables")
    and at the time that commit was correct because br_fdb_update() couldn't be
    called from process context, but that changed after commit:
    292d1398 ("bridge: add NTF_USE support")
    Using local_bh_disable/enable around br_fdb_update() allows us to keep
    using the spin_lock/unlock in br_fdb_update for the fast-path.
    Signed-off-by: default avatarNikolay Aleksandrov <nikolay@cumulusnetworks.com>
    Fixes: 292d1398 ("bridge: add NTF_USE support")
    Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
    [lizf: Backported to 3.4: adjust context]
    Signed-off-by: default avatarZefan Li <lizefan@huawei.com>
    4845c537
br_fdb.c 17.3 KB