]> git.baikalelectronics.ru Git - kernel.git/commit
net: dsa: avoid fast ageing twice when port leaves a bridge
authorVladimir Oltean <vladimir.oltean@nxp.com>
Sun, 8 Aug 2021 22:56:49 +0000 (01:56 +0300)
committerDavid S. Miller <davem@davemloft.net>
Mon, 9 Aug 2021 08:57:53 +0000 (09:57 +0100)
commitee3d92d20cbccf6463fa7cb2b7a79c834ebd99db
treee1615de3cab87863e37662c4248757ca2a415be6
parent18e4a409ef2b31391a8cf0bbef0071fb7397373e
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>
net/dsa/port.c