| .. | .. |
|---|
| 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 | |
|---|