• Vladimir Oltean's avatar
    net: dsa: felix: purge skb from TX timestamping queue if it cannot be sent · 1328a883
    Vladimir Oltean authored
    At present, when a PTP packet which requires TX timestamping gets
    dropped under congestion by the switch, things go downhill very fast.
    The driver keeps a clone of that skb in a queue of packets awaiting TX
    timestamp interrupts, but interrupts will never be raised for the
    dropped packets.
    
    Moreover, matching timestamped packets to timestamps is done by a 2-bit
    timestamp ID, and this can wrap around and we can match on the wrong skb.
    
    Since with the default NPI-based tagging protocol, we get no notification
    about packet drops, the best we can do is eventually recover from the
    drop of a PTP frame: its skb will be dead memory until another skb which
    was assigned the same timestamp ID happens to find it.
    
    However, with the ocelot-8021q tagger which injects packets using the
    manual register interface, it appears that we can check for more
    information, such as:
    
    - whether the input queue has reached the high watermark or not
    - whether the injection group's FIFO can accept additional data or not
    
    so we know that a PTP frame is likely to get dropped before actually
    sending it, and drop it ourselves (because DSA uses NETIF_F_LLTX, so it
    can't return NETDEV_TX_BUSY to ask the qdisc to requeue the packet).
    
    But when we do that, we can also remove the skb from the timestamping
    queue, because there surely won't be any timestamp that matches it.
    
    Fixes: 0a6f17c6 ("net: dsa: tag_ocelot_8021q: add support for PTP timestamping")
    Signed-off-by: default avatarVladimir Oltean <vladimir.oltean@nxp.com>
    Signed-off-by: default avatarJakub Kicinski <kuba@kernel.org>
    1328a883
felix.c 45.9 KB