]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
net: count drops due to missing qdisc as dev->tx_drops
authorJakub Kicinski <kuba@kernel.org>
Wed, 29 May 2024 16:25:27 +0000 (09:25 -0700)
committerPaolo Abeni <pabeni@redhat.com>
Tue, 4 Jun 2024 08:39:31 +0000 (10:39 +0200)
Catching and debugging missing qdiscs is pretty tricky. When qdisc
is deleted we replace it with a noop qdisc, which silently drops
all the packets. Since the noop qdisc has a single static instance
we can't count drops at the qdisc level. Count them as dev->tx_drops.

  ip netns add red
  ip link add type veth peer netns red
  ip            link set dev veth0 up
  ip -netns red link set dev veth0 up
  ip            a a dev veth0 10.0.0.1/24
  ip -netns red a a dev veth0 10.0.0.2/24
  ping -c 2 10.0.0.2
  #  2 packets transmitted, 2 received, 0% packet loss, time 1031ms
  ip -s link show dev veth0
  #  TX:  bytes packets errors dropped carrier collsns
  #        1314      17      0       0       0       0

  tc qdisc replace dev veth0 root handle 1234: mq
  tc qdisc replace dev veth0 parent 1234:1 pfifo
  tc qdisc del dev veth0 parent 1234:1
  ping -c 2 10.0.0.2
  #  2 packets transmitted, 0 received, 100% packet loss, time 1034ms
  ip -s link show dev veth0
  #  TX:  bytes packets errors dropped carrier collsns
  #        1314      17      0       3       0       0

Signed-off-by: Jakub Kicinski <kuba@kernel.org>
Link: https://lore.kernel.org/r/20240529162527.3688979-1-kuba@kernel.org
Signed-off-by: Paolo Abeni <pabeni@redhat.com>
net/sched/sch_generic.c

index 2a637a17061b91fe8e534823a8b031699bb64f4a..1417f1991452f4cd63eea9a74906e0eac3a7c19c 100644 (file)
@@ -633,6 +633,7 @@ EXPORT_SYMBOL_GPL(netif_carrier_event);
 static int noop_enqueue(struct sk_buff *skb, struct Qdisc *qdisc,
                        struct sk_buff **to_free)
 {
+       dev_core_stats_tx_dropped_inc(skb->dev);
        __qdisc_drop(skb, to_free);
        return NET_XMIT_CN;
 }