net/sched: remove hacks added to dev_trans_start() for bonding to work

Bugzilla: https://bugzilla.redhat.com/show_bug.cgi?id=2139170

commit 4873a1b2024dce9a501b56d1039ff0752027a92e
Author: Vladimir Oltean <vladimir.oltean@nxp.com>
Date:   Sun Jul 31 15:41:06 2022 +0300

    net/sched: remove hacks added to dev_trans_start() for bonding to work

    Now that the bonding driver keeps track of the last TX time of ARP and
    NS probes, we effectively revert the following commits:

    32d3e51a82 ("net_sched: use macvlan real dev trans_start in dev_trans_start()")
    07ce76aa9b ("net_sched: make dev_trans_start return vlan's real dev trans_start")

    Note that the approach of continuing to hack at this function would not
    get us very far, hence the desire to take a different approach. DSA is
    also a virtual device that uses NETIF_F_LLTX, but there, many uppers
    share the same lower (DSA master, i.e. the physical host port of a
    switch). By making dev_trans_start() on a DSA interface return the
    dev_trans_start() of the master, we effectively assume that all other
    DSA interfaces are silent, otherwise this corrupts the validity of the
    probe timestamp data from the bonding driver's perspective.

    Furthermore, the hacks didn't take into consideration the fact that the
    lower interface of @dev may not have been physical either. For example,
    VLAN over VLAN, or DSA with 2 masters in a LAG.

    And even furthermore, there are NETIF_F_LLTX devices which are not
    stacked, like veth. The hack here would not work with those, because it
    would not have to provide the bonding driver something to chew at all.

    Signed-off-by: Vladimir Oltean <vladimir.oltean@nxp.com>
    Signed-off-by: Jakub Kicinski <kuba@kernel.org>

Signed-off-by: Ivan Vecera <ivecera@redhat.com>
This commit is contained in:
Ivan Vecera 2022-11-02 15:16:53 +01:00
parent e5b654551a
commit 98543dfdfc
1 changed files with 2 additions and 6 deletions

View File

@ -427,14 +427,10 @@ void __qdisc_run(struct Qdisc *q)
unsigned long dev_trans_start(struct net_device *dev)
{
unsigned long val, res;
unsigned long res = READ_ONCE(netdev_get_tx_queue(dev, 0)->trans_start);
unsigned long val;
unsigned int i;
if (is_vlan_dev(dev))
dev = vlan_dev_real_dev(dev);
else if (netif_is_macvlan(dev))
dev = macvlan_dev_real_dev(dev);
res = READ_ONCE(netdev_get_tx_queue(dev, 0)->trans_start);
for (i = 1; i < dev->num_tx_queues; i++) {
val = READ_ONCE(netdev_get_tx_queue(dev, i)->trans_start);
if (val && time_after(val, res))