aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--include/linux/netdevice.h1
-rw-r--r--net/core/dev.c48
2 files changed, 30 insertions, 19 deletions
diff --git a/include/linux/netdevice.h b/include/linux/netdevice.h
index 7043f85e643d..c8fa4627de00 100644
--- a/include/linux/netdevice.h
+++ b/include/linux/netdevice.h
@@ -1941,6 +1941,7 @@ extern void netdev_features_change(struct net_device *dev);
1941extern void dev_load(struct net *net, const char *name); 1941extern void dev_load(struct net *net, const char *name);
1942extern void dev_mcast_init(void); 1942extern void dev_mcast_init(void);
1943extern const struct net_device_stats *dev_get_stats(struct net_device *dev); 1943extern const struct net_device_stats *dev_get_stats(struct net_device *dev);
1944extern void dev_txq_stats_fold(const struct net_device *dev, struct net_device_stats *stats);
1944 1945
1945extern int netdev_max_backlog; 1946extern int netdev_max_backlog;
1946extern int weight_p; 1947extern int weight_p;
diff --git a/net/core/dev.c b/net/core/dev.c
index d867522290b9..c3e0578d29d1 100644
--- a/net/core/dev.c
+++ b/net/core/dev.c
@@ -5169,6 +5169,32 @@ void netdev_run_todo(void)
5169} 5169}
5170 5170
5171/** 5171/**
5172 * dev_txq_stats_fold - fold tx_queues stats
5173 * @dev: device to get statistics from
5174 * @stats: struct net_device_stats to hold results
5175 */
5176void dev_txq_stats_fold(const struct net_device *dev,
5177 struct net_device_stats *stats)
5178{
5179 unsigned long tx_bytes = 0, tx_packets = 0, tx_dropped = 0;
5180 unsigned int i;
5181 struct netdev_queue *txq;
5182
5183 for (i = 0; i < dev->num_tx_queues; i++) {
5184 txq = netdev_get_tx_queue(dev, i);
5185 tx_bytes += txq->tx_bytes;
5186 tx_packets += txq->tx_packets;
5187 tx_dropped += txq->tx_dropped;
5188 }
5189 if (tx_bytes || tx_packets || tx_dropped) {
5190 stats->tx_bytes = tx_bytes;
5191 stats->tx_packets = tx_packets;
5192 stats->tx_dropped = tx_dropped;
5193 }
5194}
5195EXPORT_SYMBOL(dev_txq_stats_fold);
5196
5197/**
5172 * dev_get_stats - get network device statistics 5198 * dev_get_stats - get network device statistics
5173 * @dev: device to get statistics from 5199 * @dev: device to get statistics from
5174 * 5200 *
@@ -5182,25 +5208,9 @@ const struct net_device_stats *dev_get_stats(struct net_device *dev)
5182 5208
5183 if (ops->ndo_get_stats) 5209 if (ops->ndo_get_stats)
5184 return ops->ndo_get_stats(dev); 5210 return ops->ndo_get_stats(dev);
5185 else { 5211
5186 unsigned long tx_bytes = 0, tx_packets = 0, tx_dropped = 0; 5212 dev_txq_stats_fold(dev, &dev->stats);
5187 struct net_device_stats *stats = &dev->stats; 5213 return &dev->stats;
5188 unsigned int i;
5189 struct netdev_queue *txq;
5190
5191 for (i = 0; i < dev->num_tx_queues; i++) {
5192 txq = netdev_get_tx_queue(dev, i);
5193 tx_bytes += txq->tx_bytes;
5194 tx_packets += txq->tx_packets;
5195 tx_dropped += txq->tx_dropped;
5196 }
5197 if (tx_bytes || tx_packets || tx_dropped) {
5198 stats->tx_bytes = tx_bytes;
5199 stats->tx_packets = tx_packets;
5200 stats->tx_dropped = tx_dropped;
5201 }
5202 return stats;
5203 }
5204} 5214}
5205EXPORT_SYMBOL(dev_get_stats); 5215EXPORT_SYMBOL(dev_get_stats);
5206 5216