From: Shahar Shitrit Add TX and RX packet and byte statistics, as well as TX drop accounting. Update the counters from the data path and expose them through ndo_get_stats64. Signed-off-by: Shahar Shitrit Reviewed-by: Carolina Jubran Signed-off-by: Tariq Toukan --- .../net/ethernet/mellanox/mlx5/nodnic/en.h | 14 +++++++++++ .../ethernet/mellanox/mlx5/nodnic/en_cfg.c | 25 +++++++++++++++++++ .../net/ethernet/mellanox/mlx5/nodnic/rx.c | 3 +++ .../net/ethernet/mellanox/mlx5/nodnic/tx.c | 4 +++ 4 files changed, 46 insertions(+) diff --git a/drivers/net/ethernet/mellanox/mlx5/nodnic/en.h b/drivers/net/ethernet/mellanox/mlx5/nodnic/en.h index 19858e9da064..d811bfe242ac 100644 --- a/drivers/net/ethernet/mellanox/mlx5/nodnic/en.h +++ b/drivers/net/ethernet/mellanox/mlx5/nodnic/en.h @@ -44,6 +44,17 @@ enum mlx5_nodnic_cqe_opcode { OPCODE_CQ_INVALID, }; +struct mlx5_nodnic_sq_stats { + u64 packets; + u64 bytes; + u64 dropped; +}; + +struct mlx5_nodnic_rq_stats { + u64 packets; + u64 bytes; +}; + struct mlx5_nodnic_ring { void *wq; dma_addr_t dma_handle; @@ -109,6 +120,9 @@ struct mlx5_nodnic_priv { struct mutex state_lock; /* protects Interface state */ unsigned long state; + struct mlx5_nodnic_sq_stats sq_stats; + struct mlx5_nodnic_rq_stats rq_stats; + struct mlx5_nodnic_sq sq; struct mlx5_nodnic_rq rq; struct mlx5_nodnic_dbr dbr; /* one shared dbr for TX and RX */ diff --git a/drivers/net/ethernet/mellanox/mlx5/nodnic/en_cfg.c b/drivers/net/ethernet/mellanox/mlx5/nodnic/en_cfg.c index d73e2ec1662b..9f3ec04e7a7b 100644 --- a/drivers/net/ethernet/mellanox/mlx5/nodnic/en_cfg.c +++ b/drivers/net/ethernet/mellanox/mlx5/nodnic/en_cfg.c @@ -963,10 +963,35 @@ int mlx5_nodnic_close(struct net_device *netdev) return err; } +static void mlx5_nodnic_update_sq_stats(const struct mlx5_nodnic_sq_stats *sq, + struct rtnl_link_stats64 *s) +{ + s->tx_packets = sq->packets; + s->tx_bytes = sq->bytes; + s->tx_dropped = sq->dropped; +} + +static void mlx5_nodnic_update_rq_stats(const struct mlx5_nodnic_rq_stats *rq, + struct rtnl_link_stats64 *s) +{ + s->rx_packets = rq->packets; + s->rx_bytes = rq->bytes; +} + +static void mlx5_nodnic_get_stats64(struct net_device *netdev, + struct rtnl_link_stats64 *stats) +{ + struct mlx5_nodnic_priv *priv = netdev_priv(netdev); + + mlx5_nodnic_update_sq_stats(&priv->sq_stats, stats); + mlx5_nodnic_update_rq_stats(&priv->rq_stats, stats); +} + static const struct net_device_ops mlx5_nodnic_netdev_ops = { .ndo_open = mlx5_nodnic_open, .ndo_stop = mlx5_nodnic_close, .ndo_start_xmit = mlx5_nodnic_xmit, + .ndo_get_stats64 = mlx5_nodnic_get_stats64, .ndo_features_check = mlx5_nodnic_check_features, }; diff --git a/drivers/net/ethernet/mellanox/mlx5/nodnic/rx.c b/drivers/net/ethernet/mellanox/mlx5/nodnic/rx.c index 7736a1f24ea5..808740ec3910 100644 --- a/drivers/net/ethernet/mellanox/mlx5/nodnic/rx.c +++ b/drivers/net/ethernet/mellanox/mlx5/nodnic/rx.c @@ -152,6 +152,9 @@ void mlx5_nodnic_handle_recv_cqe(struct mlx5_nodnic_cq *cq, skb->protocol = eth_type_trans(skb, priv->netdev); nodnic_handle_rx_csum(priv->netdev, cqe, skb); + priv->rq_stats.packets++; + priv->rq_stats.bytes += byte_count; + napi_gro_receive(&cq->napi, skb); rq->cc++; diff --git a/drivers/net/ethernet/mellanox/mlx5/nodnic/tx.c b/drivers/net/ethernet/mellanox/mlx5/nodnic/tx.c index fcde1a9086f7..b6f2368155ce 100644 --- a/drivers/net/ethernet/mellanox/mlx5/nodnic/tx.c +++ b/drivers/net/ethernet/mellanox/mlx5/nodnic/tx.c @@ -143,6 +143,7 @@ netdev_tx_t mlx5_nodnic_xmit(struct sk_buff *skb, struct net_device *netdev) err = mlx5_nodnic_tx_write_wqe(sq, skb, wqe); if (err) { + priv->sq_stats.dropped++; dev_kfree_skb_any(skb); return NETDEV_TX_OK; @@ -176,6 +177,9 @@ void mlx5_nodnic_handle_send_cqe(struct mlx5_nodnic_cq *cq, wi = &sq->wqe_info[pi]; mlx5_nodnic_complete_send_wqe(sq, wi, napi_budget); + + priv->sq_stats.packets++; + priv->sq_stats.bytes += wi->num_bytes; } void mlx5_nodnic_complete_send_wqe(struct mlx5_nodnic_sq *sq, -- 2.44.0