net/mlx5e: Expose the VF/SF RX drop counter on the representor

Q counters are device-level counters that track specific
events, among which are out_of_buffer events. These events
occur when packets are dropped due to a lack of receive
buffer in the RX queue.

Expose the total number of out_of_buffer events on the
VFs/SFs to their respective representor, using the
"ip stats group link" under the name of "rx_missed".

The "rx_missed" equals the sum of all
Q counters out_of_buffer values allocated on the VFs/SFs.

Signed-off-by: Carolina Jubran <cjubran@nvidia.com>
Reviewed-by: Gal Pressman <gal@nvidia.com>
Reviewed-by: Aya Levin <ayal@nvidia.com>
Reviewed-by: Rahul Rameshbabu <rrameshbabu@nvidia.com>
Signed-off-by: Tariq Toukan <tariqt@nvidia.com>
Reviewed-by: Jacob Keller <jacob.e.keller@intel.com>
Link: https://lore.kernel.org/r/20240410214154.250583-1-tariqt@nvidia.com
Signed-off-by: Jakub Kicinski <kuba@kernel.org>
This commit is contained in:
Carolina Jubran 2024-04-11 00:41:54 +03:00 committed by Jakub Kicinski
parent ef4ba01181
commit 919b38a916
2 changed files with 43 additions and 1 deletions

View file

@ -273,6 +273,40 @@ static MLX5E_DECLARE_STATS_GRP_OP_UPDATE_STATS(vport_rep)
kvfree(out);
}
static int mlx5e_rep_query_aggr_q_counter(struct mlx5_core_dev *dev, int vport, void *out)
{
u32 in[MLX5_ST_SZ_DW(query_q_counter_in)] = {};
MLX5_SET(query_q_counter_in, in, opcode, MLX5_CMD_OP_QUERY_Q_COUNTER);
MLX5_SET(query_q_counter_in, in, other_vport, 1);
MLX5_SET(query_q_counter_in, in, vport_number, vport);
MLX5_SET(query_q_counter_in, in, aggregate, 1);
return mlx5_cmd_exec_inout(dev, query_q_counter, in, out);
}
static void mlx5e_rep_update_vport_q_counter(struct mlx5e_priv *priv)
{
struct mlx5e_rep_stats *rep_stats = &priv->stats.rep_stats;
u32 out[MLX5_ST_SZ_DW(query_q_counter_out)] = {};
struct mlx5e_rep_priv *rpriv = priv->ppriv;
struct mlx5_eswitch_rep *rep = rpriv->rep;
int err;
if (!MLX5_CAP_GEN(priv->mdev, q_counter_other_vport) ||
!MLX5_CAP_GEN(priv->mdev, q_counter_aggregation))
return;
err = mlx5e_rep_query_aggr_q_counter(priv->mdev, rep->vport, out);
if (err) {
netdev_warn(priv->netdev, "failed reading stats on vport %d, error %d\n",
rep->vport, err);
return;
}
rep_stats->rx_vport_out_of_buffer = MLX5_GET(query_q_counter_out, out, out_of_buffer);
}
static void mlx5e_rep_get_strings(struct net_device *dev,
u32 stringset, u8 *data)
{
@ -1229,6 +1263,12 @@ static int mlx5e_update_rep_rx(struct mlx5e_priv *priv)
return 0;
}
static void mlx5e_rep_stats_update_ndo_stats(struct mlx5e_priv *priv)
{
mlx5e_stats_update_ndo_stats(priv);
mlx5e_rep_update_vport_q_counter(priv);
}
static int mlx5e_rep_event_mpesw(struct mlx5e_priv *priv)
{
struct mlx5e_rep_priv *rpriv = priv->ppriv;
@ -1421,7 +1461,7 @@ static const struct mlx5e_profile mlx5e_rep_profile = {
.enable = mlx5e_rep_enable,
.disable = mlx5e_rep_disable,
.update_rx = mlx5e_update_rep_rx,
.update_stats = mlx5e_stats_update_ndo_stats,
.update_stats = mlx5e_rep_stats_update_ndo_stats,
.rx_handlers = &mlx5e_rx_handlers_rep,
.max_tc = 1,
.stats_grps = mlx5e_rep_stats_grps,

View file

@ -484,6 +484,7 @@ struct mlx5e_rep_stats {
u64 tx_vport_rdma_multicast_bytes;
u64 vport_loopback_packets;
u64 vport_loopback_bytes;
u64 rx_vport_out_of_buffer;
};
struct mlx5e_stats {
@ -504,6 +505,7 @@ static inline void mlx5e_stats_copy_rep_stats(struct rtnl_link_stats64 *vf_vport
vf_vport->tx_packets = rep_stats->vport_tx_packets;
vf_vport->rx_bytes = rep_stats->vport_rx_bytes;
vf_vport->tx_bytes = rep_stats->vport_tx_bytes;
vf_vport->rx_missed_errors = rep_stats->rx_vport_out_of_buffer;
}
extern mlx5e_stats_grp_t mlx5e_nic_stats_grps[];