]> www.infradead.org Git - users/hch/configfs.git/commitdiff
net/mlx5e: Expose the VF/SF RX drop counter on the representor
authorCarolina Jubran <cjubran@nvidia.com>
Wed, 10 Apr 2024 21:41:54 +0000 (00:41 +0300)
committerJakub Kicinski <kuba@kernel.org>
Fri, 12 Apr 2024 02:31:12 +0000 (19:31 -0700)
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>
drivers/net/ethernet/mellanox/mlx5/core/en_rep.c
drivers/net/ethernet/mellanox/mlx5/core/en_stats.h

index a74ee698671c09a031cbff9d832ecd58aec6e153..6acecf2e7cf6b33aabe911022d443c27bb8e6bcf 100644 (file)
@@ -273,6 +273,40 @@ out:
        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,
index 9cee4c9472e99f704c16985ebd1b62ffa8ceb29e..650732288616dbb986fb12354371b4738ebf4407 100644 (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[];