[<prev] [next>] [<thread-prev] [thread-next>] [day] [month] [year] [list]
Message-ID: <CAJq09z71vEXMHng1G9fHuJS_nrupcnJTQHxEPny4kQGrKO9hww@mail.gmail.com>
Date: Fri, 1 Apr 2022 00:52:20 -0300
From: Luiz Angelo Daros de Luca <luizluca@...il.com>
To: Vladimir Oltean <vladimir.oltean@....com>
Cc: "open list:NETWORKING DRIVERS" <netdev@...r.kernel.org>,
"David S . Miller" <davem@...emloft.net>,
Jakub Kicinski <kuba@...nel.org>,
Paolo Abeni <pabeni@...hat.com>,
Florian Fainelli <f.fainelli@...il.com>,
Andrew Lunn <andrew@...n.ch>,
Vivien Didelot <vivien.didelot@...il.com>
Subject: Re: [PATCH net] Revert "net: dsa: stop updating master MTU from master.c"
> This reverts commit a1ff94c2973c43bc1e2677ac63ebb15b1d1ff846.
>
> Switch drivers that don't implement ->port_change_mtu() will cause the
> DSA master to remain with an MTU of 1500, since we've deleted the other
> code path. In turn, this causes a regression for those systems, where
> MTU-sized traffic can no longer be terminated.
>
> Revert the change taking into account the fact that rtnl_lock() is now
> taken top-level from the callers of dsa_master_setup() and
> dsa_master_teardown(). Also add a comment in order for it to be
> absolutely clear why it is still needed.
>
> Fixes: a1ff94c2973c ("net: dsa: stop updating master MTU from master.c")
> Reported-by: Luiz Angelo Daros de Luca <luizluca@...il.com>
> Signed-off-by: Vladimir Oltean <vladimir.oltean@....com>
> ---
> net/dsa/master.c | 25 ++++++++++++++++++++++++-
> 1 file changed, 24 insertions(+), 1 deletion(-)
>
> diff --git a/net/dsa/master.c b/net/dsa/master.c
> index 991c2930d631..2851e44c4cf0 100644
> --- a/net/dsa/master.c
> +++ b/net/dsa/master.c
> @@ -335,11 +335,24 @@ static const struct attribute_group dsa_group = {
> .attrs = dsa_slave_attrs,
> };
>
> +static void dsa_master_reset_mtu(struct net_device *dev)
> +{
> + int err;
> +
> + err = dev_set_mtu(dev, ETH_DATA_LEN);
> + if (err)
> + netdev_dbg(dev,
> + "Unable to reset MTU to exclude DSA overheads\n");
> +}
> +
> int dsa_master_setup(struct net_device *dev, struct dsa_port *cpu_dp)
> {
> + const struct dsa_device_ops *tag_ops = cpu_dp->tag_ops;
> struct dsa_switch *ds = cpu_dp->ds;
> struct device_link *consumer_link;
> - int ret;
> + int mtu, ret;
> +
> + mtu = ETH_DATA_LEN + dsa_tag_protocol_overhead(tag_ops);
>
> /* The DSA master must use SET_NETDEV_DEV for this to work. */
> consumer_link = device_link_add(ds->dev, dev->dev.parent,
> @@ -349,6 +362,15 @@ int dsa_master_setup(struct net_device *dev, struct dsa_port *cpu_dp)
> "Failed to create a device link to DSA switch %s\n",
> dev_name(ds->dev));
>
> + /* The switch driver may not implement ->port_change_mtu(), case in
> + * which dsa_slave_change_mtu() will not update the master MTU either,
> + * so we need to do that here.
> + */
> + ret = dev_set_mtu(dev, mtu);
> + if (ret)
> + netdev_warn(dev, "error %d setting MTU to %d to include DSA overhead\n",
> + ret, mtu);
> +
> /* If we use a tagging format that doesn't have an ethertype
> * field, make sure that all packets from this point on get
> * sent to the tag format's receive function.
> @@ -384,6 +406,7 @@ void dsa_master_teardown(struct net_device *dev)
> sysfs_remove_group(&dev->dev.kobj, &dsa_group);
> dsa_netdev_ops_set(dev, NULL);
> dsa_master_ethtool_teardown(dev);
> + dsa_master_reset_mtu(dev);
> dsa_master_set_promiscuity(dev, -1);
>
> dev->dsa_ptr = NULL;
> --
> 2.25.1
>
It fixes the issue. Thanks a lot!
Tested-by: Luiz Angelo Daros de Luca <luizluca@...il.com>
Powered by blists - more mailing lists