diff options
| -rw-r--r-- | include/linux/netdevice.h | 1 | ||||
| -rw-r--r-- | net/core/dev.c | 48 |
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); | |||
| 1941 | extern void dev_load(struct net *net, const char *name); | 1941 | extern void dev_load(struct net *net, const char *name); |
| 1942 | extern void dev_mcast_init(void); | 1942 | extern void dev_mcast_init(void); |
| 1943 | extern const struct net_device_stats *dev_get_stats(struct net_device *dev); | 1943 | extern const struct net_device_stats *dev_get_stats(struct net_device *dev); |
| 1944 | extern void dev_txq_stats_fold(const struct net_device *dev, struct net_device_stats *stats); | ||
| 1944 | 1945 | ||
| 1945 | extern int netdev_max_backlog; | 1946 | extern int netdev_max_backlog; |
| 1946 | extern int weight_p; | 1947 | extern 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 | */ | ||
| 5176 | void 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 | } | ||
| 5195 | EXPORT_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 | } |
| 5205 | EXPORT_SYMBOL(dev_get_stats); | 5215 | EXPORT_SYMBOL(dev_get_stats); |
| 5206 | 5216 | ||
