Patch "net: dsa: don't error out when drivers return ETH_DATA_LEN in .port_max_mtu()" has been added to the 6.1-stable tree

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



This is a note to let you know that I've just added the patch titled

    net: dsa: don't error out when drivers return ETH_DATA_LEN in .port_max_mtu()

to the 6.1-stable tree which can be found at:
    http://www.kernel.org/git/?p=linux/kernel/git/stable/stable-queue.git;a=summary

The filename of the patch is:
     net-dsa-don-t-error-out-when-drivers-return-eth_data.patch
and it can be found in the queue-6.1 subdirectory.

If you, or anyone else, feels it should not be added to the stable tree,
please let <stable@xxxxxxxxxxxxxxx> know about it.



commit a7a716ce3b3f82da9091f52b9a769acf089dcb79
Author: Vladimir Oltean <vladimir.oltean@xxxxxxx>
Date:   Tue Mar 14 20:24:04 2023 +0200

    net: dsa: don't error out when drivers return ETH_DATA_LEN in .port_max_mtu()
    
    [ Upstream commit 636e8adf7878eab3614250234341bde45537f47a ]
    
    Currently, when dsa_slave_change_mtu() is called on a user port where
    dev->max_mtu is 1500 (as returned by ds->ops->port_max_mtu()), the code
    will stumble upon this check:
    
            if (new_master_mtu > mtu_limit)
                    return -ERANGE;
    
    because new_master_mtu is adjusted for the tagger overhead but mtu_limit
    is not.
    
    But it would be good if the logic went through, for example if the DSA
    master really depends on an MTU adjustment to accept DSA-tagged frames.
    
    To make the code pass through the check, we need to adjust mtu_limit for
    the overhead as well, if the minimum restriction was caused by the DSA
    user port's MTU (dev->max_mtu). A DSA user port MTU and a DSA master MTU
    are always offset by the protocol overhead.
    
    Currently no drivers return 1500 .port_max_mtu(), but this is only
    temporary and a bug in itself - mv88e6xxx should have done that, but
    since commit b9c587fed61c ("dsa: mv88e6xxx: Include tagger overhead when
    setting MTU for DSA and CPU ports") it no longer does. This is a
    preparation for fixing that.
    
    Fixes: bfcb813203e6 ("net: dsa: configure the MTU for switch ports")
    Signed-off-by: Vladimir Oltean <vladimir.oltean@xxxxxxx>
    Reviewed-by: Simon Horman <simon.horman@xxxxxxxxxxxx>
    Reviewed-by: Florian Fainelli <f.fainelli@xxxxxxxxx>
    Signed-off-by: David S. Miller <davem@xxxxxxxxxxxxx>
    Signed-off-by: Sasha Levin <sashal@xxxxxxxxxx>

diff --git a/net/dsa/slave.c b/net/dsa/slave.c
index a9fde48cffd43..5fe075bf479ec 100644
--- a/net/dsa/slave.c
+++ b/net/dsa/slave.c
@@ -1852,6 +1852,7 @@ int dsa_slave_change_mtu(struct net_device *dev, int new_mtu)
 	int new_master_mtu;
 	int old_master_mtu;
 	int mtu_limit;
+	int overhead;
 	int cpu_mtu;
 	int err;
 
@@ -1880,9 +1881,10 @@ int dsa_slave_change_mtu(struct net_device *dev, int new_mtu)
 			largest_mtu = slave_mtu;
 	}
 
-	mtu_limit = min_t(int, master->max_mtu, dev->max_mtu);
+	overhead = dsa_tag_protocol_overhead(cpu_dp->tag_ops);
+	mtu_limit = min_t(int, master->max_mtu, dev->max_mtu + overhead);
 	old_master_mtu = master->mtu;
-	new_master_mtu = largest_mtu + dsa_tag_protocol_overhead(cpu_dp->tag_ops);
+	new_master_mtu = largest_mtu + overhead;
 	if (new_master_mtu > mtu_limit)
 		return -ERANGE;
 
@@ -1917,8 +1919,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));
+		dsa_port_mtu_change(cpu_dp, old_master_mtu - overhead);
 out_cpu_failed:
 	if (new_master_mtu != old_master_mtu)
 		dev_set_mtu(master, old_master_mtu);



[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Index of Archives]     [Linux USB Devel]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]

  Powered by Linux