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 */
|
/* data path - accessed per napi poll */
|
||||||
struct irq_desc *irq_desc;
|
struct irq_desc *irq_desc;
|
||||||
|
struct mlx5e_ch_stats stats;
|
||||||
|
|
||||||
/* control */
|
/* control */
|
||||||
struct mlx5e_priv *priv;
|
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_sw_stats temp, *s = &temp;
|
||||||
struct mlx5e_rq_stats *rq_stats;
|
struct mlx5e_rq_stats *rq_stats;
|
||||||
struct mlx5e_sq_stats *sq_stats;
|
struct mlx5e_sq_stats *sq_stats;
|
||||||
|
struct mlx5e_ch_stats *ch_stats;
|
||||||
int i, j;
|
int i, j;
|
||||||
|
|
||||||
memset(s, 0, sizeof(*s));
|
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];
|
struct mlx5e_channel *c = priv->channels.c[i];
|
||||||
|
|
||||||
rq_stats = &c->rq.stats;
|
rq_stats = &c->rq.stats;
|
||||||
|
ch_stats = &c->stats;
|
||||||
|
|
||||||
s->rx_packets += rq_stats->packets;
|
s->rx_packets += rq_stats->packets;
|
||||||
s->rx_bytes += rq_stats->bytes;
|
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_empty += rq_stats->cache_empty;
|
||||||
s->rx_cache_busy += rq_stats->cache_busy;
|
s->rx_cache_busy += rq_stats->cache_busy;
|
||||||
s->rx_cache_waive += rq_stats->cache_waive;
|
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++) {
|
for (j = 0; j < priv->channels.params.num_tc; j++) {
|
||||||
sq_stats = &c->sq[j].stats;
|
sq_stats = &c->sq[j].stats;
|
||||||
|
@ -3781,6 +3784,7 @@ static bool mlx5e_tx_timeout_eq_recover(struct net_device *dev,
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
netdev_err(dev, "Recover %d eqes on EQ 0x%x\n", eqe_count, eq->eqn);
|
netdev_err(dev, "Recover %d eqes on EQ 0x%x\n", eqe_count, eq->eqn);
|
||||||
|
sq->channel->stats.eq_rearm++;
|
||||||
return true;
|
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_empty) },
|
||||||
{ MLX5E_DECLARE_STAT(struct mlx5e_sw_stats, rx_cache_busy) },
|
{ 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, rx_cache_waive) },
|
||||||
|
{ MLX5E_DECLARE_STAT(struct mlx5e_sw_stats, ch_eq_rearm) },
|
||||||
{ MLX5E_DECLARE_STAT(struct mlx5e_sw_stats, link_down_events_phy) },
|
{ 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) },
|
{ 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_RQ_STATS ARRAY_SIZE(rq_stats_desc)
|
||||||
#define NUM_SQ_STATS ARRAY_SIZE(sq_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)
|
static int mlx5e_grp_channels_get_num_stats(struct mlx5e_priv *priv)
|
||||||
{
|
{
|
||||||
return (NUM_RQ_STATS * priv->channels.num) +
|
return (NUM_RQ_STATS * priv->channels.num) +
|
||||||
|
(NUM_CH_STATS * priv->channels.num) +
|
||||||
(NUM_SQ_STATS * priv->channels.num * priv->channels.params.num_tc);
|
(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))
|
if (!test_bit(MLX5E_STATE_OPENED, &priv->state))
|
||||||
return idx;
|
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 (i = 0; i < priv->channels.num; i++)
|
||||||
for (j = 0; j < NUM_RQ_STATS; j++)
|
for (j = 0; j < NUM_RQ_STATS; j++)
|
||||||
sprintf(data + (idx++) * ETH_GSTRING_LEN, rq_stats_desc[j].format, i);
|
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))
|
if (!test_bit(MLX5E_STATE_OPENED, &priv->state))
|
||||||
return idx;
|
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 (i = 0; i < channels->num; i++)
|
||||||
for (j = 0; j < NUM_RQ_STATS; j++)
|
for (j = 0; j < NUM_RQ_STATS; j++)
|
||||||
data[idx++] =
|
data[idx++] =
|
||||||
|
|
|
@ -44,6 +44,7 @@
|
||||||
#define MLX5E_DECLARE_STAT(type, fld) #fld, offsetof(type, fld)
|
#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_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_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 {
|
struct counter_desc {
|
||||||
char format[ETH_GSTRING_LEN];
|
char format[ETH_GSTRING_LEN];
|
||||||
|
@ -88,6 +89,7 @@ struct mlx5e_sw_stats {
|
||||||
u64 rx_cache_empty;
|
u64 rx_cache_empty;
|
||||||
u64 rx_cache_busy;
|
u64 rx_cache_busy;
|
||||||
u64 rx_cache_waive;
|
u64 rx_cache_waive;
|
||||||
|
u64 ch_eq_rearm;
|
||||||
|
|
||||||
/* Special handling counters */
|
/* Special handling counters */
|
||||||
u64 link_down_events_phy;
|
u64 link_down_events_phy;
|
||||||
|
@ -192,6 +194,10 @@ struct mlx5e_sq_stats {
|
||||||
u64 dropped;
|
u64 dropped;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
struct mlx5e_ch_stats {
|
||||||
|
u64 eq_rearm;
|
||||||
|
};
|
||||||
|
|
||||||
struct mlx5e_stats {
|
struct mlx5e_stats {
|
||||||
struct mlx5e_sw_stats sw;
|
struct mlx5e_sw_stats sw;
|
||||||
struct mlx5e_qcounter_stats qcnt;
|
struct mlx5e_qcounter_stats qcnt;
|
||||||
|
|
Loading…
Reference in New Issue