Commit 54984407 authored by Tariq Toukan's avatar Tariq Toukan Committed by David S. Miller

net/mlx5e: Add ethtool counter for RX buffer allocation failures

Counts the number of RX buffer allocation failures and shows it
in ethtool statistics.
Signed-off-by: default avatarTariq Toukan <tariqt@mellanox.com>
Signed-off-by: default avatarSaeed Mahameed <saeedm@mellanox.com>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent e20a0db3
...@@ -189,6 +189,7 @@ static const char vport_strings[][ETH_GSTRING_LEN] = { ...@@ -189,6 +189,7 @@ static const char vport_strings[][ETH_GSTRING_LEN] = {
"rx_wqe_err", "rx_wqe_err",
"rx_mpwqe_filler", "rx_mpwqe_filler",
"rx_mpwqe_frag", "rx_mpwqe_frag",
"rx_buff_alloc_err",
}; };
struct mlx5e_vport_stats { struct mlx5e_vport_stats {
...@@ -232,8 +233,9 @@ struct mlx5e_vport_stats { ...@@ -232,8 +233,9 @@ struct mlx5e_vport_stats {
u64 rx_wqe_err; u64 rx_wqe_err;
u64 rx_mpwqe_filler; u64 rx_mpwqe_filler;
u64 rx_mpwqe_frag; 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] = { static const char pport_strings[][ETH_GSTRING_LEN] = {
...@@ -329,6 +331,7 @@ static const char rq_stats_strings[][ETH_GSTRING_LEN] = { ...@@ -329,6 +331,7 @@ static const char rq_stats_strings[][ETH_GSTRING_LEN] = {
"wqe_err", "wqe_err",
"mpwqe_filler", "mpwqe_filler",
"mpwqe_frag", "mpwqe_frag",
"buff_alloc_err",
}; };
struct mlx5e_rq_stats { struct mlx5e_rq_stats {
...@@ -341,7 +344,8 @@ struct mlx5e_rq_stats { ...@@ -341,7 +344,8 @@ struct mlx5e_rq_stats {
u64 wqe_err; u64 wqe_err;
u64 mpwqe_filler; u64 mpwqe_filler;
u64 mpwqe_frag; u64 mpwqe_frag;
#define NUM_RQ_STATS 9 u64 buff_alloc_err;
#define NUM_RQ_STATS 10
}; };
static const char sq_stats_strings[][ETH_GSTRING_LEN] = { static const char sq_stats_strings[][ETH_GSTRING_LEN] = {
......
...@@ -180,6 +180,7 @@ void mlx5e_update_stats(struct mlx5e_priv *priv) ...@@ -180,6 +180,7 @@ void mlx5e_update_stats(struct mlx5e_priv *priv)
s->rx_wqe_err = 0; s->rx_wqe_err = 0;
s->rx_mpwqe_filler = 0; s->rx_mpwqe_filler = 0;
s->rx_mpwqe_frag = 0; s->rx_mpwqe_frag = 0;
s->rx_buff_alloc_err = 0;
for (i = 0; i < priv->params.num_channels; i++) { for (i = 0; i < priv->params.num_channels; i++) {
rq_stats = &priv->channel[i]->rq.stats; rq_stats = &priv->channel[i]->rq.stats;
...@@ -192,6 +193,7 @@ void mlx5e_update_stats(struct mlx5e_priv *priv) ...@@ -192,6 +193,7 @@ void mlx5e_update_stats(struct mlx5e_priv *priv)
s->rx_wqe_err += rq_stats->wqe_err; s->rx_wqe_err += rq_stats->wqe_err;
s->rx_mpwqe_filler += rq_stats->mpwqe_filler; s->rx_mpwqe_filler += rq_stats->mpwqe_filler;
s->rx_mpwqe_frag += rq_stats->mpwqe_frag; 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++) { for (j = 0; j < priv->params.num_tc; j++) {
sq_stats = &priv->channel[i]->sq[j].stats; sq_stats = &priv->channel[i]->sq[j].stats;
......
...@@ -447,9 +447,14 @@ bool mlx5e_post_rx_wqes(struct mlx5e_rq *rq) ...@@ -447,9 +447,14 @@ bool mlx5e_post_rx_wqes(struct mlx5e_rq *rq)
while (!mlx5_wq_ll_is_full(wq)) { while (!mlx5_wq_ll_is_full(wq)) {
struct mlx5e_rx_wqe *wqe = mlx5_wq_ll_get_wqe(wq, wq->head); struct mlx5e_rx_wqe *wqe = mlx5_wq_ll_get_wqe(wq, wq->head);
int err;
if (unlikely(rq->alloc_wqe(rq, wqe, wq->head))) err = rq->alloc_wqe(rq, wqe, wq->head);
if (unlikely(err)) {
if (err != -EBUSY)
rq->stats.buff_alloc_err++;
break; break;
}
mlx5_wq_ll_push(wq, be16_to_cpu(wqe->next.next_wqe_index)); mlx5_wq_ll_push(wq, be16_to_cpu(wqe->next.next_wqe_index));
} }
...@@ -701,8 +706,10 @@ void mlx5e_handle_rx_cqe_mpwrq(struct mlx5e_rq *rq, struct mlx5_cqe64 *cqe) ...@@ -701,8 +706,10 @@ void mlx5e_handle_rx_cqe_mpwrq(struct mlx5e_rq *rq, struct mlx5_cqe64 *cqe)
skb = napi_alloc_skb(rq->cq.napi, skb = napi_alloc_skb(rq->cq.napi,
ALIGN(MLX5_MPWRQ_SMALL_PACKET_THRESHOLD, ALIGN(MLX5_MPWRQ_SMALL_PACKET_THRESHOLD,
sizeof(long))); sizeof(long)));
if (unlikely(!skb)) if (unlikely(!skb)) {
rq->stats.buff_alloc_err++;
goto mpwrq_cqe_out; goto mpwrq_cqe_out;
}
prefetch(skb->data); prefetch(skb->data);
cqe_bcnt = mpwrq_get_cqe_byte_cnt(cqe); cqe_bcnt = mpwrq_get_cqe_byte_cnt(cqe);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment