• Vladimir Oltean's avatar
    net: dsa: avoid fast ageing twice when port leaves a bridge · bee7c577
    Vladimir Oltean authored
    Drivers that support both the toggling of address learning and dynamic
    FDB flushing (mv88e6xxx, b53, sja1105) currently need to fast-age a port
    twice when it leaves a bridge:
    
    - once, when del_nbp() calls br_stp_disable_port() which puts the port
      in the BLOCKING state
    - twice, when dsa_port_switchdev_unsync_attrs() calls
      dsa_port_clear_brport_flags() which disables address learning
    
    The knee-jerk reaction might be to say "dsa_port_clear_brport_flags does
    not need to fast-age the port at all", but the thing is, we still need
    both code paths to flush the dynamic FDB entries in different situations.
    When a DSA switch port leaves a bonding/team interface that is (still) a
    bridge port, no del_nbp() will be called, so we rely on
    dsa_port_clear_brport_flags() function to restore proper standalone port
    functionality with address learning disabled.
    
    So the solution is just to avoid double the work when both code paths
    are called in series. Luckily, DSA already caches the STP port state, so
    we can skip flushing the dynamic FDB when we disable address learning
    and the STP state is one where no address learning takes place at all.
    Under that condition, not flushing the FDB is safe because there is
    supposed to not be any dynamic FDB entry at all (they were flushed
    during the transition towards that state, and none were learned in the
    meanwhile).
    Signed-off-by: default avatarVladimir Oltean <vladimir.oltean@nxp.com>
    Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
    bee7c577
port.c 31.9 KB