net: net: add a core netdev->tx_dropped counter
authorEric Dumazet <edumazet@google.com>
Thu, 27 Mar 2014 15:45:56 +0000 (08:45 -0700)
committerDavid S. Miller <davem@davemloft.net>
Fri, 28 Mar 2014 20:49:48 +0000 (16:49 -0400)
Dropping packets in __dev_queue_xmit() when transmit queue
is stopped (NIC TX ring buffer full or BQL limit reached) currently
outputs a syslog message.

It would be better to get a precise count of such events available in
netdevice stats so that monitoring tools can have a clue.

This extends the work done in caf586e5f23ce
("net: add a core netdev->rx_dropped counter")

Signed-off-by: Eric Dumazet <edumazet@google.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
include/linux/netdevice.h
net/core/dev.c

index 4b6d12c7b803b7955848fa9309d725ba09da4d79..159c7e7945f84e919a4c08d7469c72b39f34a1b4 100644 (file)
@@ -1311,9 +1311,10 @@ struct net_device {
        int                     iflink;
 
        struct net_device_stats stats;
-       atomic_long_t           rx_dropped; /* dropped packets by core network
-                                            * Do not use this in drivers.
-                                            */
+
+       /* dropped packets by core network, Do not use this in drivers */
+       atomic_long_t           rx_dropped;
+       atomic_long_t           tx_dropped;
 
 #ifdef CONFIG_WIRELESS_EXT
        /* List of functions to handle Wireless Extensions (instead of ioctl).
index 48dd323d59183a9904e35fdcd31b39981b626495..98ba581b89f066d3e5b885a8f1012f8d193e123c 100644 (file)
@@ -2880,6 +2880,7 @@ recursion_alert:
        rc = -ENETDOWN;
        rcu_read_unlock_bh();
 
+       atomic_long_inc(&dev->tx_dropped);
        kfree_skb(skb);
        return rc;
 out:
@@ -6238,6 +6239,7 @@ struct rtnl_link_stats64 *dev_get_stats(struct net_device *dev,
                netdev_stats_to_stats64(storage, &dev->stats);
        }
        storage->rx_dropped += atomic_long_read(&dev->rx_dropped);
+       storage->tx_dropped += atomic_long_read(&dev->tx_dropped);
        return storage;
 }
 EXPORT_SYMBOL(dev_get_stats);