Netdev Archive on lore.kernel.org
help / color / mirror / Atom feed
* [PATCH net-next 0/2] DSA fast ageing fixes/improvements
@ 2021-08-08 22:56 Vladimir Oltean
  2021-08-08 22:56 ` [PATCH net-next 1/2] net: dsa: still fast-age ports joining a bridge if they can't configure learning Vladimir Oltean
                   ` (2 more replies)
  0 siblings, 3 replies; 4+ messages in thread
From: Vladimir Oltean @ 2021-08-08 22:56 UTC (permalink / raw)
  To: netdev, Jakub Kicinski, David S. Miller
  Cc: Andrew Lunn, Florian Fainelli, Vivien Didelot, Vladimir Oltean

These are 2 small improvements brought to the DSA fast ageing changes
merged earlier today.

Patch 1 restores the behavior for DSA drivers that don't implement the
.port_bridge_flags function (I don't think there is any breakage due
to the new behavior, but just to be sure). This came as a result of
Andrew's review.

Patch 2 reduces the number of fast ages of a port from 2 to 1 when it
leaves a bridge.

Vladimir Oltean (2):
  net: dsa: still fast-age ports joining a bridge if they can't
    configure learning
  net: dsa: avoid fast ageing twice when port leaves a bridge

 net/dsa/port.c | 22 ++++++++++++++++++++--
 1 file changed, 20 insertions(+), 2 deletions(-)

-- 
2.25.1


^ permalink raw reply	[flat|nested] 4+ messages in thread

* [PATCH net-next 1/2] net: dsa: still fast-age ports joining a bridge if they can't configure learning
  2021-08-08 22:56 [PATCH net-next 0/2] DSA fast ageing fixes/improvements Vladimir Oltean
@ 2021-08-08 22:56 ` Vladimir Oltean
  2021-08-08 22:56 ` [PATCH net-next 2/2] net: dsa: avoid fast ageing twice when port leaves a bridge Vladimir Oltean
  2021-08-09  9:00 ` [PATCH net-next 0/2] DSA fast ageing fixes/improvements patchwork-bot+netdevbpf
  2 siblings, 0 replies; 4+ messages in thread
From: Vladimir Oltean @ 2021-08-08 22:56 UTC (permalink / raw)
  To: netdev, Jakub Kicinski, David S. Miller
  Cc: Andrew Lunn, Florian Fainelli, Vivien Didelot, Vladimir Oltean

Commit 39f32101543b ("net: dsa: don't fast age standalone ports")
assumed that all standalone ports disable address learning, but if the
switch driver implements .port_fast_age but not .port_bridge_flags (like
ksz9477, ksz8795, lantiq_gswip, lan9303), then that might not actually
be true.

So whereas before, the bridge temporarily walking us through the
BLOCKING STP state meant that the standalone ports had a checkpoint to
flush their baggage and start fresh when they join a bridge, after that
commit they no longer do.

Restore the old behavior for these drivers by checking if the switch can
toggle address learning. If it can't, disregard the "do_fast_age"
argument and unconditionally perform fast ageing on STP state changes.

Signed-off-by: Vladimir Oltean <vladimir.oltean@nxp.com>
---
 net/dsa/port.c | 18 +++++++++++++++++-
 1 file changed, 17 insertions(+), 1 deletion(-)

diff --git a/net/dsa/port.c b/net/dsa/port.c
index 96a4de67eccb..aac87ac989ed 100644
--- a/net/dsa/port.c
+++ b/net/dsa/port.c
@@ -60,6 +60,21 @@ static void dsa_port_fast_age(const struct dsa_port *dp)
 	dsa_port_notify_bridge_fdb_flush(dp);
 }
 
+static bool dsa_port_can_configure_learning(struct dsa_port *dp)
+{
+	struct switchdev_brport_flags flags = {
+		.mask = BR_LEARNING,
+	};
+	struct dsa_switch *ds = dp->ds;
+	int err;
+
+	if (!ds->ops->port_bridge_flags || !ds->ops->port_pre_bridge_flags)
+		return false;
+
+	err = ds->ops->port_pre_bridge_flags(ds, dp->index, flags, NULL);
+	return !err;
+}
+
 int dsa_port_set_state(struct dsa_port *dp, u8 state, bool do_fast_age)
 {
 	struct dsa_switch *ds = dp->ds;
@@ -70,7 +85,8 @@ int dsa_port_set_state(struct dsa_port *dp, u8 state, bool do_fast_age)
 
 	ds->ops->port_stp_state_set(ds, port, state);
 
-	if (do_fast_age && dp->learning) {
+	if (!dsa_port_can_configure_learning(dp) ||
+	    (do_fast_age && dp->learning)) {
 		/* Fast age FDB entries or flush appropriate forwarding database
 		 * for the given port, if we are moving it from Learning or
 		 * Forwarding state, to Disabled or Blocking or Listening state.
-- 
2.25.1


^ permalink raw reply	[flat|nested] 4+ messages in thread

* [PATCH net-next 2/2] net: dsa: avoid fast ageing twice when port leaves a bridge
  2021-08-08 22:56 [PATCH net-next 0/2] DSA fast ageing fixes/improvements Vladimir Oltean
  2021-08-08 22:56 ` [PATCH net-next 1/2] net: dsa: still fast-age ports joining a bridge if they can't configure learning Vladimir Oltean
@ 2021-08-08 22:56 ` Vladimir Oltean
  2021-08-09  9:00 ` [PATCH net-next 0/2] DSA fast ageing fixes/improvements patchwork-bot+netdevbpf
  2 siblings, 0 replies; 4+ messages in thread
From: Vladimir Oltean @ 2021-08-08 22:56 UTC (permalink / raw)
  To: netdev, Jakub Kicinski, David S. Miller
  Cc: Andrew Lunn, Florian Fainelli, Vivien Didelot, Vladimir Oltean

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>
---
 net/dsa/port.c | 4 +++-
 1 file changed, 3 insertions(+), 1 deletion(-)

diff --git a/net/dsa/port.c b/net/dsa/port.c
index aac87ac989ed..831d50d28d59 100644
--- a/net/dsa/port.c
+++ b/net/dsa/port.c
@@ -699,7 +699,9 @@ int dsa_port_bridge_flags(struct dsa_port *dp,
 		if (learning == dp->learning)
 			return 0;
 
-		if (dp->learning && !learning)
+		if ((dp->learning && !learning) &&
+		    (dp->stp_state == BR_STATE_LEARNING ||
+		     dp->stp_state == BR_STATE_FORWARDING))
 			dsa_port_fast_age(dp);
 
 		dp->learning = learning;
-- 
2.25.1


^ permalink raw reply	[flat|nested] 4+ messages in thread

* Re: [PATCH net-next 0/2] DSA fast ageing fixes/improvements
  2021-08-08 22:56 [PATCH net-next 0/2] DSA fast ageing fixes/improvements Vladimir Oltean
  2021-08-08 22:56 ` [PATCH net-next 1/2] net: dsa: still fast-age ports joining a bridge if they can't configure learning Vladimir Oltean
  2021-08-08 22:56 ` [PATCH net-next 2/2] net: dsa: avoid fast ageing twice when port leaves a bridge Vladimir Oltean
@ 2021-08-09  9:00 ` patchwork-bot+netdevbpf
  2 siblings, 0 replies; 4+ messages in thread
From: patchwork-bot+netdevbpf @ 2021-08-09  9:00 UTC (permalink / raw)
  To: Vladimir Oltean
  Cc: netdev, kuba, davem, andrew, f.fainelli, vivien.didelot, olteanv

Hello:

This series was applied to netdev/net-next.git (refs/heads/master):

On Mon,  9 Aug 2021 01:56:47 +0300 you wrote:
> These are 2 small improvements brought to the DSA fast ageing changes
> merged earlier today.
> 
> Patch 1 restores the behavior for DSA drivers that don't implement the
> .port_bridge_flags function (I don't think there is any breakage due
> to the new behavior, but just to be sure). This came as a result of
> Andrew's review.
> 
> [...]

Here is the summary with links:
  - [net-next,1/2] net: dsa: still fast-age ports joining a bridge if they can't configure learning
    https://git.kernel.org/netdev/net-next/c/a4ffe09fc2d7
  - [net-next,2/2] net: dsa: avoid fast ageing twice when port leaves a bridge
    https://git.kernel.org/netdev/net-next/c/bee7c577e6d7

You are awesome, thank you!
--
Deet-doot-dot, I am a bot.
https://korg.docs.kernel.org/patchwork/pwbot.html



^ permalink raw reply	[flat|nested] 4+ messages in thread

end of thread, other threads:[~2021-08-09  9:00 UTC | newest]

Thread overview: 4+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2021-08-08 22:56 [PATCH net-next 0/2] DSA fast ageing fixes/improvements Vladimir Oltean
2021-08-08 22:56 ` [PATCH net-next 1/2] net: dsa: still fast-age ports joining a bridge if they can't configure learning Vladimir Oltean
2021-08-08 22:56 ` [PATCH net-next 2/2] net: dsa: avoid fast ageing twice when port leaves a bridge Vladimir Oltean
2021-08-09  9:00 ` [PATCH net-next 0/2] DSA fast ageing fixes/improvements patchwork-bot+netdevbpf

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).