net: dsa: don't emit targeted cross-chip notifiers for MTU change
authorVladimir Oltean <vladimir.oltean@nxp.com>
Fri, 15 Apr 2022 15:46:26 +0000 (18:46 +0300)
committerDavid S. Miller <davem@davemloft.net>
Wed, 20 Apr 2022 09:34:34 +0000 (10:34 +0100)
A cross-chip notifier with "targeted_match=true" is one that matches
only the local port of the switch that emitted it. In other words,
passing through the cross-chip notifier layer serves no purpose.

Eliminate this concept by calling directly ds->ops->port_change_mtu
instead of emitting a targeted cross-chip notifier. This leaves the
DSA_NOTIFIER_MTU event being emitted only for MTU updates on the CPU
port, which need to be reflected also across all DSA links.

Signed-off-by: Vladimir Oltean <vladimir.oltean@nxp.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
net/dsa/dsa_priv.h
net/dsa/port.c
net/dsa/slave.c
net/dsa/switch.c

index 6798229..7c9abd5 100644 (file)
@@ -100,7 +100,6 @@ struct dsa_notifier_vlan_info {
 /* DSA_NOTIFIER_MTU */
 struct dsa_notifier_mtu_info {
        const struct dsa_port *dp;
-       bool targeted_match;
        int mtu;
 };
 
@@ -231,8 +230,7 @@ int dsa_port_mst_enable(struct dsa_port *dp, bool on,
                        struct netlink_ext_ack *extack);
 int dsa_port_vlan_msti(struct dsa_port *dp,
                       const struct switchdev_vlan_msti *msti);
-int dsa_port_mtu_change(struct dsa_port *dp, int new_mtu,
-                       bool targeted_match);
+int dsa_port_mtu_change(struct dsa_port *dp, int new_mtu);
 int dsa_port_fdb_add(struct dsa_port *dp, const unsigned char *addr,
                     u16 vid);
 int dsa_port_fdb_del(struct dsa_port *dp, const unsigned char *addr,
index 711de8f..8856ed6 100644 (file)
@@ -930,12 +930,10 @@ int dsa_port_vlan_msti(struct dsa_port *dp,
        return ds->ops->vlan_msti_set(ds, *dp->bridge, msti);
 }
 
-int dsa_port_mtu_change(struct dsa_port *dp, int new_mtu,
-                       bool targeted_match)
+int dsa_port_mtu_change(struct dsa_port *dp, int new_mtu)
 {
        struct dsa_notifier_mtu_info info = {
                .dp = dp,
-               .targeted_match = targeted_match,
                .mtu = new_mtu,
        };
 
index bf93d6b..63da683 100644 (file)
@@ -1859,15 +1859,14 @@ int dsa_slave_change_mtu(struct net_device *dev, int new_mtu)
                        goto out_master_failed;
 
                /* We only need to propagate the MTU of the CPU port to
-                * upstream switches, so create a non-targeted notifier which
-                * updates all switches.
+                * upstream switches, so emit a notifier which updates them.
                 */
-               err = dsa_port_mtu_change(cpu_dp, cpu_mtu, false);
+               err = dsa_port_mtu_change(cpu_dp, cpu_mtu);
                if (err)
                        goto out_cpu_failed;
        }
 
-       err = dsa_port_mtu_change(dp, new_mtu, true);
+       err = ds->ops->port_change_mtu(ds, dp->index, new_mtu);
        if (err)
                goto out_port_failed;
 
@@ -1880,8 +1879,7 @@ int dsa_slave_change_mtu(struct net_device *dev, int new_mtu)
 out_port_failed:
        if (new_master_mtu != old_master_mtu)
                dsa_port_mtu_change(cpu_dp, old_master_mtu -
-                                   dsa_tag_protocol_overhead(cpu_dp->tag_ops),
-                                   false);
+                                   dsa_tag_protocol_overhead(cpu_dp->tag_ops));
 out_cpu_failed:
        if (new_master_mtu != old_master_mtu)
                dev_set_mtu(master, old_master_mtu);
index d3df168..704975e 100644 (file)
@@ -49,19 +49,7 @@ static int dsa_switch_ageing_time(struct dsa_switch *ds,
 static bool dsa_port_mtu_match(struct dsa_port *dp,
                               struct dsa_notifier_mtu_info *info)
 {
-       if (dp == info->dp)
-               return true;
-
-       /* Do not propagate to other switches in the tree if the notifier was
-        * targeted for a single switch.
-        */
-       if (info->targeted_match)
-               return false;
-
-       if (dsa_port_is_dsa(dp) || dsa_port_is_cpu(dp))
-               return true;
-
-       return false;
+       return dp == info->dp || dsa_port_is_dsa(dp) || dsa_port_is_cpu(dp);
 }
 
 static int dsa_switch_mtu(struct dsa_switch *ds,