[PATCH v2 net-next 00/26] net: introduce and use generic XDP stats

From: Alexander Lobakin
Date: Tue Nov 23 2021 - 11:41:21 EST


This is an almost complete rework of [0].

This series introduces generic XDP statistics infra based on rtnl
xstats (Ethtool standard stats previously), and wires up the drivers
which collect appropriate statistics to this new interface. Finally,
it introduces XDP/XSK statistics to all XDP-capable Intel drivers.

Those counters are:
* packets: number of frames passed to bpf_prog_run_xdp().
* bytes: number of bytes went through bpf_prog_run_xdp().
* errors: number of general XDP errors, if driver has one unified
counter.
* aborted: number of XDP_ABORTED returns.
* drop: number of XDP_DROP returns.
* invalid: number of returns of unallowed values (i.e. not XDP_*).
* pass: number of XDP_PASS returns.
* redirect: number of successfully performed XDP_REDIRECT requests.
* redirect_errors: number of failed XDP_REDIRECT requests.
* tx: number of successfully performed XDP_TX requests.
* tx_errors: number of failed XDP_TX requests.
* xmit_packets: number of successfully transmitted XDP/XSK frames.
* xmit_bytes: number of successfully transmitted XDP/XSK frames.
* xmit_errors: of XDP/XSK frames failed to transmit.
* xmit_full: number of XDP/XSK queue being full at the moment of
transmission.

To provide them, developers need to implement .ndo_get_xdp_stats()
and, if they want to expose stats on a per-channel basis,
.ndo_get_xdp_stats_nch(). include/net/xdp.h contains some helper
structs and functions which might be useful for doing this.
It is up to developers to decide whether to implement XDP stats in
their drivers or not, depending on the needs and so on, but if so,
it is implied that they will be implemented using this new infra
rather than custom Ethtool entries. XDP stats {,type} list can be
expanded if needed as counters are being provided as nested NL attrs.
There's an option to provide XDP and XSK counters separately, and I
used it in mlx5 (has separate RQs and SQs) and Intel (have separate
NAPI poll routines) drivers.

Example output of iproute2's new command:

$ ip link xdpstats dev enp178s0
16: enp178s0:
xdp-channel0-rx_xdp_packets: 0
xdp-channel0-rx_xdp_bytes: 1
xdp-channel0-rx_xdp_errors: 2
xdp-channel0-rx_xdp_aborted: 3
xdp-channel0-rx_xdp_drop: 4
xdp-channel0-rx_xdp_invalid: 5
xdp-channel0-rx_xdp_pass: 6
xdp-channel0-rx_xdp_redirect: 7
xdp-channel0-rx_xdp_redirect_errors: 8
xdp-channel0-rx_xdp_tx: 9
xdp-channel0-rx_xdp_tx_errors: 10
xdp-channel0-tx_xdp_xmit_packets: 11
xdp-channel0-tx_xdp_xmit_bytes: 12
xdp-channel0-tx_xdp_xmit_errors: 13
xdp-channel0-tx_xdp_xmit_full: 14
[ ... ]

This series doesn't touch existing Ethtool-exposed XDP stats due
to the potential breakage of custom{,er} scripts and other stuff
that might be hardwired on their presence. Developers are free to
drop them on their own if possible. In ideal case we would see
Ethtool stats free from anything related to XDP, but it's unlikely
to happen (:

XDP_PASS kpps on an ice NIC with ~50 Gbps line rate:

Frame size 64 | 128 | 256 | 512 | 1024 | 1532
----------------------------------------------------------
net-next 23557 | 23750 | 20731 | 11723 | 6270 | 4377
This series 23484 | 23812 | 20679 | 11720 | 6270 | 4377

The same situation with XDP_DROP and several more common cases:
nothing past stddev (which is a bit surprising, but not complaining
at all).

A brief series breakdown:
* 1-2: introduce new infra and APIs, for rtnetlink and drivers
respectively;
* 3-19: add needed callback to the existing drivers to export
their stats using new infra. Some of the patches are cosmetic
prereqs;
* 20-25: add XDP/XSK stats to all Intel drivers;
* 26: mention generic XDP stats in Documentation.

This set is also available here: [1]
A separate iproute2-next patch will be published in parallel,
for now you can find it here: [2]

>From v1 [0]:
- use rtnl xstats instead of Ethtool standard -- XDP stats are
purely software while Ethtool infra was designed for HW stats
(Jakub);
- split xmit into xmit_packets and xmit_bytes, add xmit_full;
- don't touch existing drivers custom XDP stats exposed via
Ethtool (Jakub);
- add a bunch of helper structs and functions to reduce boilerplates
and code duplication in new drivers;
- merge with the series which adds XDP stats to Intel drivers;
- add some perf numbers per Jakub's request.

[0] https://lore.kernel.org/all/20210803163641.3743-1-alexandr.lobakin@xxxxxxxxx
[1] https://github.com/alobakin/linux/pull/11
[2] https://github.com/alobakin/iproute2/pull/1

Alexander Lobakin (26):
rtnetlink: introduce generic XDP statistics
xdp: provide common driver helpers for implementing XDP stats
ena: implement generic XDP statistics callbacks
dpaa2: implement generic XDP stats callbacks
enetc: implement generic XDP stats callbacks
mvneta: reformat mvneta_netdev_ops
mvneta: add .ndo_get_xdp_stats() callback
mvpp2: provide .ndo_get_xdp_stats() callback
mlx5: don't mix XDP_DROP and Rx XDP error cases
mlx5: provide generic XDP stats callbacks
sf100, sfx: implement generic XDP stats callbacks
veth: don't mix XDP_DROP counter with Rx XDP errors
veth: drop 'xdp_' suffix from packets and bytes stats
veth: reformat veth_netdev_ops
veth: add generic XDP stats callbacks
virtio_net: don't mix XDP_DROP counter with Rx XDP errors
virtio_net: rename xdp_tx{,_drops} SQ stats to xdp_xmit{,_errors}
virtio_net: reformat virtnet_netdev
virtio_net: add callbacks for generic XDP stats
i40e: add XDP and XSK generic per-channel statistics
ice: add XDP and XSK generic per-channel statistics
igb: add XDP generic per-channel statistics
igc: bail out early on XSK xmit if no descs are available
igc: add XDP and XSK generic per-channel statistics
ixgbe: add XDP and XSK generic per-channel statistics
Documentation: reflect generic XDP statistics

Documentation/networking/statistics.rst | 33 +++
drivers/net/ethernet/amazon/ena/ena_netdev.c | 53 ++++
.../net/ethernet/freescale/dpaa2/dpaa2-eth.c | 45 +++
drivers/net/ethernet/freescale/enetc/enetc.c | 48 ++++
drivers/net/ethernet/freescale/enetc/enetc.h | 3 +
.../net/ethernet/freescale/enetc/enetc_pf.c | 2 +
drivers/net/ethernet/intel/i40e/i40e.h | 1 +
drivers/net/ethernet/intel/i40e/i40e_main.c | 38 ++-
drivers/net/ethernet/intel/i40e/i40e_txrx.c | 40 ++-
drivers/net/ethernet/intel/i40e/i40e_txrx.h | 1 +
drivers/net/ethernet/intel/i40e/i40e_xsk.c | 33 ++-
drivers/net/ethernet/intel/ice/ice.h | 2 +
drivers/net/ethernet/intel/ice/ice_lib.c | 21 ++
drivers/net/ethernet/intel/ice/ice_main.c | 17 ++
drivers/net/ethernet/intel/ice/ice_txrx.c | 33 ++-
drivers/net/ethernet/intel/ice/ice_txrx.h | 12 +-
drivers/net/ethernet/intel/ice/ice_txrx_lib.c | 3 +
drivers/net/ethernet/intel/ice/ice_xsk.c | 51 +++-
drivers/net/ethernet/intel/igb/igb.h | 14 +-
drivers/net/ethernet/intel/igb/igb_main.c | 102 ++++++-
drivers/net/ethernet/intel/igc/igc.h | 3 +
drivers/net/ethernet/intel/igc/igc_main.c | 89 +++++-
drivers/net/ethernet/intel/ixgbe/ixgbe.h | 1 +
drivers/net/ethernet/intel/ixgbe/ixgbe_lib.c | 3 +-
drivers/net/ethernet/intel/ixgbe/ixgbe_main.c | 69 ++++-
drivers/net/ethernet/intel/ixgbe/ixgbe_xsk.c | 56 +++-
drivers/net/ethernet/marvell/mvneta.c | 78 +++++-
.../net/ethernet/marvell/mvpp2/mvpp2_main.c | 51 ++++
drivers/net/ethernet/mellanox/mlx5/core/en.h | 5 +
.../net/ethernet/mellanox/mlx5/core/en/xdp.c | 3 +-
.../net/ethernet/mellanox/mlx5/core/en_main.c | 2 +
.../ethernet/mellanox/mlx5/core/en_stats.c | 76 +++++
.../ethernet/mellanox/mlx5/core/en_stats.h | 3 +
drivers/net/ethernet/sfc/ef100_netdev.c | 2 +
drivers/net/ethernet/sfc/efx.c | 2 +
drivers/net/ethernet/sfc/efx_common.c | 42 +++
drivers/net/ethernet/sfc/efx_common.h | 3 +
drivers/net/veth.c | 128 +++++++--
drivers/net/virtio_net.c | 104 +++++--
include/linux/if_link.h | 39 ++-
include/linux/netdevice.h | 13 +
include/net/xdp.h | 162 +++++++++++
include/uapi/linux/if_link.h | 67 +++++
net/core/rtnetlink.c | 264 ++++++++++++++++++
net/core/xdp.c | 124 ++++++++
45 files changed, 1798 insertions(+), 143 deletions(-)

--
2.33.1