.. | .. |
---|
| 1 | +// SPDX-License-Identifier: GPL-2.0-only |
---|
1 | 2 | #include <linux/module.h> |
---|
2 | 3 | #include <linux/kernel.h> |
---|
3 | 4 | #include <linux/if_arp.h> |
---|
.. | .. |
---|
10 | 11 | /* Virtio transport max packet size plus header */ |
---|
11 | 12 | #define DEFAULT_MTU (VIRTIO_VSOCK_MAX_PKT_BUF_SIZE + \ |
---|
12 | 13 | sizeof(struct af_vsockmon_hdr)) |
---|
13 | | - |
---|
14 | | -struct pcpu_lstats { |
---|
15 | | - u64 rx_packets; |
---|
16 | | - u64 rx_bytes; |
---|
17 | | - struct u64_stats_sync syncp; |
---|
18 | | -}; |
---|
19 | 14 | |
---|
20 | 15 | static int vsockmon_dev_init(struct net_device *dev) |
---|
21 | 16 | { |
---|
.. | .. |
---|
52 | 47 | |
---|
53 | 48 | static netdev_tx_t vsockmon_xmit(struct sk_buff *skb, struct net_device *dev) |
---|
54 | 49 | { |
---|
55 | | - int len = skb->len; |
---|
56 | | - struct pcpu_lstats *stats = this_cpu_ptr(dev->lstats); |
---|
57 | | - |
---|
58 | | - u64_stats_update_begin(&stats->syncp); |
---|
59 | | - stats->rx_bytes += len; |
---|
60 | | - stats->rx_packets++; |
---|
61 | | - u64_stats_update_end(&stats->syncp); |
---|
| 50 | + dev_lstats_add(dev, skb->len); |
---|
62 | 51 | |
---|
63 | 52 | dev_kfree_skb(skb); |
---|
64 | 53 | |
---|
.. | .. |
---|
68 | 57 | static void |
---|
69 | 58 | vsockmon_get_stats64(struct net_device *dev, struct rtnl_link_stats64 *stats) |
---|
70 | 59 | { |
---|
71 | | - int i; |
---|
72 | | - u64 bytes = 0, packets = 0; |
---|
| 60 | + dev_lstats_read(dev, &stats->rx_packets, &stats->rx_bytes); |
---|
73 | 61 | |
---|
74 | | - for_each_possible_cpu(i) { |
---|
75 | | - const struct pcpu_lstats *vstats; |
---|
76 | | - u64 tbytes, tpackets; |
---|
77 | | - unsigned int start; |
---|
78 | | - |
---|
79 | | - vstats = per_cpu_ptr(dev->lstats, i); |
---|
80 | | - |
---|
81 | | - do { |
---|
82 | | - start = u64_stats_fetch_begin_irq(&vstats->syncp); |
---|
83 | | - tbytes = vstats->rx_bytes; |
---|
84 | | - tpackets = vstats->rx_packets; |
---|
85 | | - } while (u64_stats_fetch_retry_irq(&vstats->syncp, start)); |
---|
86 | | - |
---|
87 | | - packets += tpackets; |
---|
88 | | - bytes += tbytes; |
---|
89 | | - } |
---|
90 | | - |
---|
91 | | - stats->rx_packets = packets; |
---|
92 | 62 | stats->tx_packets = 0; |
---|
93 | | - |
---|
94 | | - stats->rx_bytes = bytes; |
---|
95 | 63 | stats->tx_bytes = 0; |
---|
96 | 64 | } |
---|
97 | 65 | |
---|