Expose basic vNIC device statistics via hstat. Signed-off-by: Jakub Kicinski <jakub.kicin...@netronome.com> --- drivers/net/ethernet/netronome/nfp/Makefile | 1 + .../net/ethernet/netronome/nfp/nfp_hstat.c | 70 +++++++++++++++++++ drivers/net/ethernet/netronome/nfp/nfp_net.h | 3 + .../ethernet/netronome/nfp/nfp_net_common.c | 1 + 4 files changed, 75 insertions(+) create mode 100644 drivers/net/ethernet/netronome/nfp/nfp_hstat.c
diff --git a/drivers/net/ethernet/netronome/nfp/Makefile b/drivers/net/ethernet/netronome/nfp/Makefile index 47c708f08ade..4721abe9bfbf 100644 --- a/drivers/net/ethernet/netronome/nfp/Makefile +++ b/drivers/net/ethernet/netronome/nfp/Makefile @@ -19,6 +19,7 @@ nfp-objs := \ nfp_app.o \ nfp_app_nic.o \ nfp_devlink.o \ + nfp_hstat.o \ nfp_hwmon.o \ nfp_main.o \ nfp_net_common.o \ diff --git a/drivers/net/ethernet/netronome/nfp/nfp_hstat.c b/drivers/net/ethernet/netronome/nfp/nfp_hstat.c new file mode 100644 index 000000000000..9480d3b6caa5 --- /dev/null +++ b/drivers/net/ethernet/netronome/nfp/nfp_hstat.c @@ -0,0 +1,70 @@ +// SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause) +/* Copyright (C) 2019 Netronome Systems, Inc. */ + +#include <net/hstats.h> + +#include "nfp_net.h" + +/* NFD per-vNIC stats */ +static int +nfp_hstat_vnic_nfd_basic_get_rx(struct net_device *netdev, + struct rtnl_hstat_req *req, + const struct rtnl_hstat_group *grp) +{ + struct nfp_net *nn = netdev_priv(netdev); + + rtnl_hstat_dump(req, IFLA_HSTATS_STAT_LINUX_PKTS, + nn_readq(nn, NFP_NET_CFG_STATS_RX_FRAMES)); + rtnl_hstat_dump(req, IFLA_HSTATS_STAT_LINUX_BYTES, + nn_readq(nn, NFP_NET_CFG_STATS_RX_OCTETS)); + return 0; +} + +static const struct rtnl_hstat_group nfp_hstat_vnic_nfd_rx = { + .qualifiers = { + RTNL_HSTATS_QUALS_BASIC(DEV, RX), + }, + + .get_stats = nfp_hstat_vnic_nfd_basic_get_rx, + .stats = { + [0] = RTNL_HSTATS_STAT_LINUX_PKTS_BIT | + RTNL_HSTATS_STAT_LINUX_BYTES_BIT, + }, + .stats_cnt = 2, +}; + +static int +nfp_hstat_vnic_nfd_basic_get_tx(struct net_device *netdev, + struct rtnl_hstat_req *req, + const struct rtnl_hstat_group *grp) +{ + struct nfp_net *nn = netdev_priv(netdev); + + rtnl_hstat_dump(req, IFLA_HSTATS_STAT_LINUX_PKTS, + nn_readq(nn, NFP_NET_CFG_STATS_TX_FRAMES)); + rtnl_hstat_dump(req, IFLA_HSTATS_STAT_LINUX_BYTES, + nn_readq(nn, NFP_NET_CFG_STATS_TX_OCTETS)); + return 0; +} + +static const struct rtnl_hstat_group nfp_hstat_vnic_nfd_tx = { + .qualifiers = { + RTNL_HSTATS_QUALS_BASIC(DEV, TX), + }, + + .get_stats = nfp_hstat_vnic_nfd_basic_get_tx, + .stats = { + [0] = RTNL_HSTATS_STAT_LINUX_PKTS_BIT | + RTNL_HSTATS_STAT_LINUX_BYTES_BIT, + }, + .stats_cnt = 2, +}; + +int nfp_net_hstat_get_groups(const struct net_device *netdev, + struct rtnl_hstat_req *req) +{ + rtnl_hstat_add_grp(req, &nfp_hstat_vnic_nfd_rx); + rtnl_hstat_add_grp(req, &nfp_hstat_vnic_nfd_tx); + + return 0; +} diff --git a/drivers/net/ethernet/netronome/nfp/nfp_net.h b/drivers/net/ethernet/netronome/nfp/nfp_net.h index 93de25b39bc1..08396a23edeb 100644 --- a/drivers/net/ethernet/netronome/nfp/nfp_net.h +++ b/drivers/net/ethernet/netronome/nfp/nfp_net.h @@ -105,6 +105,7 @@ struct nfp_eth_table_port; struct nfp_net; struct nfp_net_r_vector; struct nfp_port; +struct rtnl_hstat_req; /* Convenience macro for wrapping descriptor index on ring size */ #define D_IDX(ring, idx) ((idx) & ((ring)->cnt - 1)) @@ -910,4 +911,6 @@ static inline void nfp_net_debugfs_dir_clean(struct dentry **dir) } #endif /* CONFIG_NFP_DEBUG */ +int nfp_net_hstat_get_groups(const struct net_device *dev, + struct rtnl_hstat_req *req); #endif /* _NFP_NET_H_ */ diff --git a/drivers/net/ethernet/netronome/nfp/nfp_net_common.c b/drivers/net/ethernet/netronome/nfp/nfp_net_common.c index 7d2d4241498f..87ebfc3f0471 100644 --- a/drivers/net/ethernet/netronome/nfp/nfp_net_common.c +++ b/drivers/net/ethernet/netronome/nfp/nfp_net_common.c @@ -3531,6 +3531,7 @@ const struct net_device_ops nfp_net_netdev_ops = { .ndo_udp_tunnel_add = nfp_net_add_vxlan_port, .ndo_udp_tunnel_del = nfp_net_del_vxlan_port, .ndo_bpf = nfp_net_xdp, + .ndo_hstat_get_groups = nfp_net_hstat_get_groups, }; /** -- 2.19.2