91 lines
3.0 KiB
Diff
91 lines
3.0 KiB
Diff
From ae1658272c6491a31ac968e39882fc569f312ac3 Mon Sep 17 00:00:00 2001
|
|
From: Daniel Borkmann <daniel@iogearbox.net>
|
|
Date: Tue, 14 Nov 2023 01:42:15 +0100
|
|
Subject: [PATCH] netkit: Add tstats per-CPU traffic counters
|
|
|
|
Add dev->tstats traffic accounting to netkit. The latter contains per-CPU
|
|
RX and TX counters.
|
|
|
|
The dev's TX counters are bumped upon pass/unspec as well as redirect
|
|
verdicts, in other words, on everything except for drops.
|
|
|
|
The dev's RX counters are bumped upon successful __netif_rx(), as well
|
|
as from skb_do_redirect() (not part of this commit here).
|
|
|
|
Using dev->lstats with having just a single packets/bytes counter and
|
|
inferring one another's RX counters from the peer dev's lstats is not
|
|
possible given skb_do_redirect() can also bump the device's stats.
|
|
|
|
Signed-off-by: Daniel Borkmann <daniel@iogearbox.net>
|
|
Acked-by: Nikolay Aleksandrov <razor@blackwall.org>
|
|
Link: https://lore.kernel.org/r/20231114004220.6495-4-daniel@iogearbox.net
|
|
Signed-off-by: Martin KaFai Lau <martin.lau@kernel.org>
|
|
---
|
|
drivers/net/netkit.c | 19 ++++++++++++++++++-
|
|
1 file changed, 18 insertions(+), 1 deletion(-)
|
|
|
|
--- a/drivers/net/netkit.c
|
|
+++ b/drivers/net/netkit.c
|
|
@@ -68,6 +68,7 @@ static netdev_tx_t netkit_xmit(struct sk
|
|
netdev_tx_t ret_dev = NET_XMIT_SUCCESS;
|
|
const struct bpf_mprog_entry *entry;
|
|
struct net_device *peer;
|
|
+ int len = skb->len;
|
|
|
|
rcu_read_lock();
|
|
peer = rcu_dereference(nk->peer);
|
|
@@ -85,15 +86,22 @@ static netdev_tx_t netkit_xmit(struct sk
|
|
case NETKIT_PASS:
|
|
skb->protocol = eth_type_trans(skb, skb->dev);
|
|
skb_postpull_rcsum(skb, eth_hdr(skb), ETH_HLEN);
|
|
- __netif_rx(skb);
|
|
+ if (likely(__netif_rx(skb) == NET_RX_SUCCESS)) {
|
|
+ dev_sw_netstats_tx_add(dev, 1, len);
|
|
+ dev_sw_netstats_rx_add(peer, len);
|
|
+ } else {
|
|
+ goto drop_stats;
|
|
+ }
|
|
break;
|
|
case NETKIT_REDIRECT:
|
|
+ dev_sw_netstats_tx_add(dev, 1, len);
|
|
skb_do_redirect(skb);
|
|
break;
|
|
case NETKIT_DROP:
|
|
default:
|
|
drop:
|
|
kfree_skb(skb);
|
|
+drop_stats:
|
|
dev_core_stats_tx_dropped_inc(dev);
|
|
ret_dev = NET_XMIT_DROP;
|
|
break;
|
|
@@ -174,6 +182,13 @@ static struct net_device *netkit_peer_de
|
|
return rcu_dereference(netkit_priv(dev)->peer);
|
|
}
|
|
|
|
+static void netkit_get_stats(struct net_device *dev,
|
|
+ struct rtnl_link_stats64 *stats)
|
|
+{
|
|
+ dev_fetch_sw_netstats(stats, dev->tstats);
|
|
+ stats->tx_dropped = DEV_STATS_READ(dev, tx_dropped);
|
|
+}
|
|
+
|
|
static void netkit_uninit(struct net_device *dev);
|
|
|
|
static const struct net_device_ops netkit_netdev_ops = {
|
|
@@ -184,6 +199,7 @@ static const struct net_device_ops netki
|
|
.ndo_set_rx_headroom = netkit_set_headroom,
|
|
.ndo_get_iflink = netkit_get_iflink,
|
|
.ndo_get_peer_dev = netkit_peer_dev,
|
|
+ .ndo_get_stats64 = netkit_get_stats,
|
|
.ndo_uninit = netkit_uninit,
|
|
.ndo_features_check = passthru_features_check,
|
|
};
|
|
@@ -218,6 +234,7 @@ static void netkit_setup(struct net_devi
|
|
|
|
ether_setup(dev);
|
|
dev->max_mtu = ETH_MAX_MTU;
|
|
+ dev->pcpu_stat_type = NETDEV_PCPU_STAT_TSTATS;
|
|
|
|
dev->flags |= IFF_NOARP;
|
|
dev->priv_flags &= ~IFF_TX_SKB_SHARING;
|