| .. | .. |
|---|
| 1 | +// SPDX-License-Identifier: GPL-2.0-only |
|---|
| 1 | 2 | #include <linux/module.h> |
|---|
| 2 | 3 | #include <linux/kernel.h> |
|---|
| 3 | 4 | #include <linux/netdevice.h> |
|---|
| .. | .. |
|---|
| 6 | 7 | #include <linux/if_arp.h> |
|---|
| 7 | 8 | #include <net/rtnetlink.h> |
|---|
| 8 | 9 | |
|---|
| 9 | | -struct pcpu_lstats { |
|---|
| 10 | | - u64 packets; |
|---|
| 11 | | - u64 bytes; |
|---|
| 12 | | - struct u64_stats_sync syncp; |
|---|
| 13 | | -}; |
|---|
| 14 | | - |
|---|
| 15 | 10 | static netdev_tx_t nlmon_xmit(struct sk_buff *skb, struct net_device *dev) |
|---|
| 16 | 11 | { |
|---|
| 17 | | - int len = skb->len; |
|---|
| 18 | | - struct pcpu_lstats *stats = this_cpu_ptr(dev->lstats); |
|---|
| 19 | | - |
|---|
| 20 | | - u64_stats_update_begin(&stats->syncp); |
|---|
| 21 | | - stats->bytes += len; |
|---|
| 22 | | - stats->packets++; |
|---|
| 23 | | - u64_stats_update_end(&stats->syncp); |
|---|
| 12 | + dev_lstats_add(dev, skb->len); |
|---|
| 24 | 13 | |
|---|
| 25 | 14 | dev_kfree_skb(skb); |
|---|
| 26 | 15 | |
|---|
| .. | .. |
|---|
| 61 | 50 | static void |
|---|
| 62 | 51 | nlmon_get_stats64(struct net_device *dev, struct rtnl_link_stats64 *stats) |
|---|
| 63 | 52 | { |
|---|
| 64 | | - int i; |
|---|
| 65 | | - u64 bytes = 0, packets = 0; |
|---|
| 53 | + u64 packets, bytes; |
|---|
| 66 | 54 | |
|---|
| 67 | | - for_each_possible_cpu(i) { |
|---|
| 68 | | - const struct pcpu_lstats *nl_stats; |
|---|
| 69 | | - u64 tbytes, tpackets; |
|---|
| 70 | | - unsigned int start; |
|---|
| 71 | | - |
|---|
| 72 | | - nl_stats = per_cpu_ptr(dev->lstats, i); |
|---|
| 73 | | - |
|---|
| 74 | | - do { |
|---|
| 75 | | - start = u64_stats_fetch_begin_irq(&nl_stats->syncp); |
|---|
| 76 | | - tbytes = nl_stats->bytes; |
|---|
| 77 | | - tpackets = nl_stats->packets; |
|---|
| 78 | | - } while (u64_stats_fetch_retry_irq(&nl_stats->syncp, start)); |
|---|
| 79 | | - |
|---|
| 80 | | - packets += tpackets; |
|---|
| 81 | | - bytes += tbytes; |
|---|
| 82 | | - } |
|---|
| 55 | + dev_lstats_read(dev, &packets, &bytes); |
|---|
| 83 | 56 | |
|---|
| 84 | 57 | stats->rx_packets = packets; |
|---|
| 85 | 58 | stats->tx_packets = 0; |
|---|