|
@@ -280,35 +280,19 @@ void ovs_vport_del(struct vport *vport)
|
|
|
*/
|
|
|
void ovs_vport_get_stats(struct vport *vport, struct ovs_vport_stats *stats)
|
|
|
{
|
|
|
- struct net_device *dev = vport->dev;
|
|
|
- int i;
|
|
|
-
|
|
|
- memset(stats, 0, sizeof(*stats));
|
|
|
- stats->rx_errors = dev->stats.rx_errors;
|
|
|
- stats->tx_errors = dev->stats.tx_errors;
|
|
|
- stats->tx_dropped = dev->stats.tx_dropped;
|
|
|
- stats->rx_dropped = dev->stats.rx_dropped;
|
|
|
-
|
|
|
- stats->rx_dropped += atomic_long_read(&dev->rx_dropped);
|
|
|
- stats->tx_dropped += atomic_long_read(&dev->tx_dropped);
|
|
|
-
|
|
|
- for_each_possible_cpu(i) {
|
|
|
- const struct pcpu_sw_netstats *percpu_stats;
|
|
|
- struct pcpu_sw_netstats local_stats;
|
|
|
- unsigned int start;
|
|
|
-
|
|
|
- percpu_stats = per_cpu_ptr(dev->tstats, i);
|
|
|
-
|
|
|
- do {
|
|
|
- start = u64_stats_fetch_begin_irq(&percpu_stats->syncp);
|
|
|
- local_stats = *percpu_stats;
|
|
|
- } while (u64_stats_fetch_retry_irq(&percpu_stats->syncp, start));
|
|
|
-
|
|
|
- stats->rx_bytes += local_stats.rx_bytes;
|
|
|
- stats->rx_packets += local_stats.rx_packets;
|
|
|
- stats->tx_bytes += local_stats.tx_bytes;
|
|
|
- stats->tx_packets += local_stats.tx_packets;
|
|
|
- }
|
|
|
+ const struct rtnl_link_stats64 *dev_stats;
|
|
|
+ struct rtnl_link_stats64 temp;
|
|
|
+
|
|
|
+ dev_stats = dev_get_stats(vport->dev, &temp);
|
|
|
+ stats->rx_errors = dev_stats->rx_errors;
|
|
|
+ stats->tx_errors = dev_stats->tx_errors;
|
|
|
+ stats->tx_dropped = dev_stats->tx_dropped;
|
|
|
+ stats->rx_dropped = dev_stats->rx_dropped;
|
|
|
+
|
|
|
+ stats->rx_bytes = dev_stats->rx_bytes;
|
|
|
+ stats->rx_packets = dev_stats->rx_packets;
|
|
|
+ stats->tx_bytes = dev_stats->tx_bytes;
|
|
|
+ stats->tx_packets = dev_stats->tx_packets;
|
|
|
}
|
|
|
|
|
|
/**
|