net/mlx5e: Add per-channel counters infrastructure, use it upon TX timeout
authorEran Ben Elisha <eranbe@mellanox.com>
Tue, 19 Dec 2017 12:53:34 +0000 (14:53 +0200)
committerSaeed Mahameed <saeedm@mellanox.com>
Fri, 19 Jan 2018 20:41:33 +0000 (22:41 +0200)
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>
drivers/net/ethernet/mellanox/mlx5/core/en.h
drivers/net/ethernet/mellanox/mlx5/core/en_main.c
drivers/net/ethernet/mellanox/mlx5/core/en_stats.c
drivers/net/ethernet/mellanox/mlx5/core/en_stats.h

index a3536e051052b46a9a3b6d2035e56c48a766c58c..a70ae3abcbbe6fdb489b129685d09b89e625386b 100644 (file)
@@ -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;
index 12ea5e319e38cdd72161fc09b612afbacb6ebaf2..f61f4f475497fd99cd4318237548792aecc7f8e2 100644 (file)
@@ -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;
 }
 
index b74ddc7984bc580820eeeb04562ecfeb0a55fad4..a4d787208d606d2787078677a5d48afc8ccbea0e 100644 (file)
@@ -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++] =
index d679e21f686e9d5a90fe6fa31eb3cfdbe191a9c9..4316765d9d66df09d48a3062250cdd3eb845948f 100644 (file)
@@ -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;