Skip to content

Commit bee7c57

Browse files
vladimirolteandavem330
authored andcommitted
net: dsa: avoid fast ageing twice when port leaves a bridge
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: Vladimir Oltean <vladimir.oltean@nxp.com> Signed-off-by: David S. Miller <davem@davemloft.net>
1 parent a4ffe09 commit bee7c57

File tree

1 file changed

+3
-1
lines changed

1 file changed

+3
-1
lines changed

net/dsa/port.c

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -699,7 +699,9 @@ int dsa_port_bridge_flags(struct dsa_port *dp,
699699
if (learning == dp->learning)
700700
return 0;
701701

702-
if (dp->learning && !learning)
702+
if ((dp->learning && !learning) &&
703+
(dp->stp_state == BR_STATE_LEARNING ||
704+
dp->stp_state == BR_STATE_FORWARDING))
703705
dsa_port_fast_age(dp);
704706

705707
dp->learning = learning;

0 commit comments

Comments
 (0)