• Vladimir Oltean's avatar
    net: dsa: fix bridge_num not getting cleared after ports leaving the bridge · 1bec0f05
    Vladimir Oltean authored
    The dp->bridge_num is zero-based, with -1 being the encoding for an
    invalid value. But dsa_bridge_num_put used to check for an invalid value
    by comparing bridge_num with 0, which is of course incorrect.
    
    The result is that the bridge_num will never get cleared by
    dsa_bridge_num_put, and further port joins to other bridges will get a
    bridge_num larger than the previous one, and once all the available
    bridges with TX forwarding offload supported by the hardware get
    exhausted, the TX forwarding offload feature is simply disabled.
    
    In the case of sja1105, 7 iterations of the loop below are enough to
    exhaust the TX forwarding offload bits, and further bridge joins operate
    without that feature.
    
    ip link add br0 type bridge vlan_filtering 1
    
    while :; do
            ip link set sw0p2 master br0 && sleep 1
            ip link set sw0p2 nomaster && sleep 1
    done
    
    This issue is enough of an indication that having the dp->bridge_num
    invalid encoding be a negative number is prone to bugs, so this will be
    changed to a one-based value, with the dp->bridge_num of zero being the
    indication of no bridge. However, that is material for net-next.
    
    Fixes: f5e165e7 ("net: dsa: track unique bridge numbers across all DSA switch trees")
    Signed-off-by: default avatarVladimir Oltean <vladimir.oltean@nxp.com>
    Signed-off-by: default avatarJakub Kicinski <kuba@kernel.org>
    1bec0f05
dsa2.c 37.7 KB