net/mlx5e: Add per-channel counters infrastructure, use it upon TX timeout
Add per-channel counter ch#_eq_rearm to monitor how many lost interrupt recovery actions happened upon TX timeouts. Signed-off-by: Eran Ben Elisha <eranbe@mellanox.com> Reviewed-by: Tariq Toukan <tariqt@mellanox.com> Signed-off-by: Saeed Mahameed <saeedm@mellanox.com>
This commit is contained in:
parent
7ca560b5af
commit
57d689a8ca
|
@ -561,6 +561,7 @@ struct mlx5e_channel {
|
|||
|
||||
/* data path - accessed per napi poll */
|
||||
struct irq_desc *irq_desc;
|
||||
struct mlx5e_ch_stats stats;
|
||||
|
||||
/* control */
|
||||
struct mlx5e_priv *priv;
|
||||
|
|
|
@ -178,6 +178,7 @@ static void mlx5e_update_sw_counters(struct mlx5e_priv *priv)
|
|||
struct mlx5e_sw_stats temp, *s = &temp;
|
||||
struct mlx5e_rq_stats *rq_stats;
|
||||
struct mlx5e_sq_stats *sq_stats;
|
||||
struct mlx5e_ch_stats *ch_stats;
|
||||
int i, j;
|
||||
|
||||
memset(s, 0, sizeof(*s));
|
||||
|
@ -185,6 +186,7 @@ static void mlx5e_update_sw_counters(struct mlx5e_priv *priv)
|
|||
struct mlx5e_channel *c = priv->channels.c[i];
|
||||
|
||||
rq_stats = &c->rq.stats;
|
||||
ch_stats = &c->stats;
|
||||
|
||||
s->rx_packets += rq_stats->packets;
|
||||
s->rx_bytes += rq_stats->bytes;
|
||||
|
@ -209,6 +211,7 @@ static void mlx5e_update_sw_counters(struct mlx5e_priv *priv)
|
|||
s->rx_cache_empty += rq_stats->cache_empty;
|
||||
s->rx_cache_busy += rq_stats->cache_busy;
|
||||
s->rx_cache_waive += rq_stats->cache_waive;
|
||||
s->ch_eq_rearm += ch_stats->eq_rearm;
|
||||
|
||||
for (j = 0; j < priv->channels.params.num_tc; j++) {
|
||||
sq_stats = &c->sq[j].stats;
|
||||
|
@ -3781,6 +3784,7 @@ static bool mlx5e_tx_timeout_eq_recover(struct net_device *dev,
|
|||
return false;
|
||||
|
||||
netdev_err(dev, "Recover %d eqes on EQ 0x%x\n", eqe_count, eq->eqn);
|
||||
sq->channel->stats.eq_rearm++;
|
||||
return true;
|
||||
}
|
||||
|
||||
|
|
|
@ -71,6 +71,7 @@ static const struct counter_desc sw_stats_desc[] = {
|
|||
{ MLX5E_DECLARE_STAT(struct mlx5e_sw_stats, rx_cache_empty) },
|
||||
{ MLX5E_DECLARE_STAT(struct mlx5e_sw_stats, rx_cache_busy) },
|
||||
{ MLX5E_DECLARE_STAT(struct mlx5e_sw_stats, rx_cache_waive) },
|
||||
{ MLX5E_DECLARE_STAT(struct mlx5e_sw_stats, ch_eq_rearm) },
|
||||
{ MLX5E_DECLARE_STAT(struct mlx5e_sw_stats, link_down_events_phy) },
|
||||
};
|
||||
|
||||
|
@ -767,12 +768,18 @@ static const struct counter_desc sq_stats_desc[] = {
|
|||
{ MLX5E_DECLARE_TX_STAT(struct mlx5e_sq_stats, xmit_more) },
|
||||
};
|
||||
|
||||
static const struct counter_desc ch_stats_desc[] = {
|
||||
{ MLX5E_DECLARE_CH_STAT(struct mlx5e_ch_stats, eq_rearm) },
|
||||
};
|
||||
|
||||
#define NUM_RQ_STATS ARRAY_SIZE(rq_stats_desc)
|
||||
#define NUM_SQ_STATS ARRAY_SIZE(sq_stats_desc)
|
||||
#define NUM_CH_STATS ARRAY_SIZE(ch_stats_desc)
|
||||
|
||||
static int mlx5e_grp_channels_get_num_stats(struct mlx5e_priv *priv)
|
||||
{
|
||||
return (NUM_RQ_STATS * priv->channels.num) +
|
||||
(NUM_CH_STATS * priv->channels.num) +
|
||||
(NUM_SQ_STATS * priv->channels.num * priv->channels.params.num_tc);
|
||||
}
|
||||
|
||||
|
@ -784,6 +791,11 @@ static int mlx5e_grp_channels_fill_strings(struct mlx5e_priv *priv, u8 *data,
|
|||
if (!test_bit(MLX5E_STATE_OPENED, &priv->state))
|
||||
return idx;
|
||||
|
||||
for (i = 0; i < priv->channels.num; i++)
|
||||
for (j = 0; j < NUM_CH_STATS; j++)
|
||||
sprintf(data + (idx++) * ETH_GSTRING_LEN,
|
||||
ch_stats_desc[j].format, i);
|
||||
|
||||
for (i = 0; i < priv->channels.num; i++)
|
||||
for (j = 0; j < NUM_RQ_STATS; j++)
|
||||
sprintf(data + (idx++) * ETH_GSTRING_LEN, rq_stats_desc[j].format, i);
|
||||
|
@ -807,6 +819,12 @@ static int mlx5e_grp_channels_fill_stats(struct mlx5e_priv *priv, u64 *data,
|
|||
if (!test_bit(MLX5E_STATE_OPENED, &priv->state))
|
||||
return idx;
|
||||
|
||||
for (i = 0; i < channels->num; i++)
|
||||
for (j = 0; j < NUM_CH_STATS; j++)
|
||||
data[idx++] =
|
||||
MLX5E_READ_CTR64_CPU(&channels->c[i]->stats,
|
||||
ch_stats_desc, j);
|
||||
|
||||
for (i = 0; i < channels->num; i++)
|
||||
for (j = 0; j < NUM_RQ_STATS; j++)
|
||||
data[idx++] =
|
||||
|
|
|
@ -44,6 +44,7 @@
|
|||
#define MLX5E_DECLARE_STAT(type, fld) #fld, offsetof(type, fld)
|
||||
#define MLX5E_DECLARE_RX_STAT(type, fld) "rx%d_"#fld, offsetof(type, fld)
|
||||
#define MLX5E_DECLARE_TX_STAT(type, fld) "tx%d_"#fld, offsetof(type, fld)
|
||||
#define MLX5E_DECLARE_CH_STAT(type, fld) "ch%d_"#fld, offsetof(type, fld)
|
||||
|
||||
struct counter_desc {
|
||||
char format[ETH_GSTRING_LEN];
|
||||
|
@ -88,6 +89,7 @@ struct mlx5e_sw_stats {
|
|||
u64 rx_cache_empty;
|
||||
u64 rx_cache_busy;
|
||||
u64 rx_cache_waive;
|
||||
u64 ch_eq_rearm;
|
||||
|
||||
/* Special handling counters */
|
||||
u64 link_down_events_phy;
|
||||
|
@ -192,6 +194,10 @@ struct mlx5e_sq_stats {
|
|||
u64 dropped;
|
||||
};
|
||||
|
||||
struct mlx5e_ch_stats {
|
||||
u64 eq_rearm;
|
||||
};
|
||||
|
||||
struct mlx5e_stats {
|
||||
struct mlx5e_sw_stats sw;
|
||||
struct mlx5e_qcounter_stats qcnt;
|
||||
|
|
Loading…
Reference in New Issue