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