From: Tariq Toukan <tar...@mellanox.com>

Counts the number of RX SKB allocation failures and shows it
in ethtool statistics.

Signed-off-by: Tariq Toukan <tar...@mellanox.com>
Signed-off-by: Saeed Mahameed <sae...@mellanox.com>
---
 drivers/net/ethernet/mellanox/mlx5/core/en.h      |    8 ++++++--
 drivers/net/ethernet/mellanox/mlx5/core/en_main.c |    2 ++
 drivers/net/ethernet/mellanox/mlx5/core/en_rx.c   |    8 ++++++--
 3 files changed, 14 insertions(+), 4 deletions(-)

diff --git a/drivers/net/ethernet/mellanox/mlx5/core/en.h 
b/drivers/net/ethernet/mellanox/mlx5/core/en.h
index 77bf54c..bc391c9 100644
--- a/drivers/net/ethernet/mellanox/mlx5/core/en.h
+++ b/drivers/net/ethernet/mellanox/mlx5/core/en.h
@@ -189,6 +189,7 @@ static const char vport_strings[][ETH_GSTRING_LEN] = {
        "rx_wqe_err",
        "rx_mpwqe_filler",
        "rx_mpwqe_frag",
+       "rx_buff_alloc_err",
 };
 
 struct mlx5e_vport_stats {
@@ -232,8 +233,9 @@ struct mlx5e_vport_stats {
        u64 rx_wqe_err;
        u64 rx_mpwqe_filler;
        u64 rx_mpwqe_frag;
+       u64 rx_buff_alloc_err;
 
-#define NUM_VPORT_COUNTERS     37
+#define NUM_VPORT_COUNTERS     38
 };
 
 static const char pport_strings[][ETH_GSTRING_LEN] = {
@@ -329,6 +331,7 @@ static const char rq_stats_strings[][ETH_GSTRING_LEN] = {
        "wqe_err",
        "mpwqe_filler",
        "mpwqe_frag",
+       "buff_alloc_err",
 };
 
 struct mlx5e_rq_stats {
@@ -341,7 +344,8 @@ struct mlx5e_rq_stats {
        u64 wqe_err;
        u64 mpwqe_filler;
        u64 mpwqe_frag;
-#define NUM_RQ_STATS 8
+       u64 buff_alloc_err;
+#define NUM_RQ_STATS 9
 };
 
 static const char sq_stats_strings[][ETH_GSTRING_LEN] = {
diff --git a/drivers/net/ethernet/mellanox/mlx5/core/en_main.c 
b/drivers/net/ethernet/mellanox/mlx5/core/en_main.c
index 784962c..56d7888 100644
--- a/drivers/net/ethernet/mellanox/mlx5/core/en_main.c
+++ b/drivers/net/ethernet/mellanox/mlx5/core/en_main.c
@@ -181,6 +181,7 @@ void mlx5e_update_stats(struct mlx5e_priv *priv)
        s->rx_wqe_err           = 0;
        s->rx_mpwqe_filler      = 0;
        s->rx_mpwqe_frag        = 0;
+       s->rx_buff_alloc_err    = 0;
        for (i = 0; i < priv->params.num_channels; i++) {
                rq_stats = &priv->channel[i]->rq.stats;
 
@@ -193,6 +194,7 @@ void mlx5e_update_stats(struct mlx5e_priv *priv)
                s->rx_wqe_err   += rq_stats->wqe_err;
                s->rx_mpwqe_filler += rq_stats->mpwqe_filler;
                s->rx_mpwqe_frag   += rq_stats->mpwqe_frag;
+               s->rx_buff_alloc_err += rq_stats->buff_alloc_err;
 
                for (j = 0; j < priv->params.num_tc; j++) {
                        sq_stats = &priv->channel[i]->sq[j].stats;
diff --git a/drivers/net/ethernet/mellanox/mlx5/core/en_rx.c 
b/drivers/net/ethernet/mellanox/mlx5/core/en_rx.c
index b53e9bd..89b8ace 100644
--- a/drivers/net/ethernet/mellanox/mlx5/core/en_rx.c
+++ b/drivers/net/ethernet/mellanox/mlx5/core/en_rx.c
@@ -48,8 +48,10 @@ int mlx5e_alloc_rx_wqe(struct mlx5e_rq *rq, struct 
mlx5e_rx_wqe *wqe, u16 ix)
        dma_addr_t dma_addr;
 
        skb = napi_alloc_skb(rq->cq.napi, rq->wqe_sz);
-       if (unlikely(!skb))
+       if (unlikely(!skb)) {
+               rq->stats.buff_alloc_err++;
                return -ENOMEM;
+       }
 
        dma_addr = dma_map_single(rq->pdev,
                                  /* hw start padding */
@@ -645,8 +647,10 @@ void mlx5e_handle_rx_cqe_mpwrq(struct mlx5e_rq *rq, struct 
mlx5_cqe64 *cqe)
        }
 
        skb = napi_alloc_skb(rq->cq.napi, MLX5_MPWRQ_SMALL_PACKET_THRESHOLD);
-       if (unlikely(!skb))
+       if (unlikely(!skb)) {
+               rq->stats.buff_alloc_err++;
                goto mpwrq_cqe_out;
+       }
 
        cqe_bcnt = mpwrq_get_cqe_byte_cnt(cqe);
        wi->complete_wqe(rq, cqe, cqe_bcnt, wi, skb);
-- 
1.7.1

Reply via email to