diff options
author | Eran Ben Elisha <eranbe@mellanox.com> | 2018-01-09 09:21:16 -0500 |
---|---|---|
committer | Saeed Mahameed <saeedm@mellanox.com> | 2018-03-27 20:17:28 -0400 |
commit | 16cc14d817338fc297970d2d9d146c88ec87474d (patch) | |
tree | 32d601ec2252ca5cf250a85fb276d9d08b36fa1f | |
parent | 1acae6b030164217b9c6a52245eade730057152b (diff) |
net/mlx5e: Dump xmit error completions
Monitor and dump xmit error completions. In addition, add err_cqe
counter to track the number of error completion per send queue.
Signed-off-by: Eran Ben Elisha <eranbe@mellanox.com>
Signed-off-by: Saeed Mahameed <saeedm@mellanox.com>
-rw-r--r-- | drivers/net/ethernet/mellanox/mlx5/core/en_stats.c | 3 | ||||
-rw-r--r-- | drivers/net/ethernet/mellanox/mlx5/core/en_stats.h | 2 | ||||
-rw-r--r-- | drivers/net/ethernet/mellanox/mlx5/core/en_tx.c | 19 |
3 files changed, 24 insertions, 0 deletions
diff --git a/drivers/net/ethernet/mellanox/mlx5/core/en_stats.c b/drivers/net/ethernet/mellanox/mlx5/core/en_stats.c index c0dab9a8969e..ad91d9de0240 100644 --- a/drivers/net/ethernet/mellanox/mlx5/core/en_stats.c +++ b/drivers/net/ethernet/mellanox/mlx5/core/en_stats.c | |||
@@ -60,6 +60,7 @@ static const struct counter_desc sw_stats_desc[] = { | |||
60 | { MLX5E_DECLARE_STAT(struct mlx5e_sw_stats, tx_queue_wake) }, | 60 | { MLX5E_DECLARE_STAT(struct mlx5e_sw_stats, tx_queue_wake) }, |
61 | { MLX5E_DECLARE_STAT(struct mlx5e_sw_stats, tx_queue_dropped) }, | 61 | { MLX5E_DECLARE_STAT(struct mlx5e_sw_stats, tx_queue_dropped) }, |
62 | { MLX5E_DECLARE_STAT(struct mlx5e_sw_stats, tx_xmit_more) }, | 62 | { MLX5E_DECLARE_STAT(struct mlx5e_sw_stats, tx_xmit_more) }, |
63 | { MLX5E_DECLARE_STAT(struct mlx5e_sw_stats, tx_cqe_err) }, | ||
63 | { MLX5E_DECLARE_STAT(struct mlx5e_sw_stats, rx_wqe_err) }, | 64 | { MLX5E_DECLARE_STAT(struct mlx5e_sw_stats, rx_wqe_err) }, |
64 | { MLX5E_DECLARE_STAT(struct mlx5e_sw_stats, rx_mpwqe_filler) }, | 65 | { MLX5E_DECLARE_STAT(struct mlx5e_sw_stats, rx_mpwqe_filler) }, |
65 | { MLX5E_DECLARE_STAT(struct mlx5e_sw_stats, rx_buff_alloc_err) }, | 66 | { MLX5E_DECLARE_STAT(struct mlx5e_sw_stats, rx_buff_alloc_err) }, |
@@ -153,6 +154,7 @@ static void mlx5e_grp_sw_update_stats(struct mlx5e_priv *priv) | |||
153 | s->tx_queue_stopped += sq_stats->stopped; | 154 | s->tx_queue_stopped += sq_stats->stopped; |
154 | s->tx_queue_wake += sq_stats->wake; | 155 | s->tx_queue_wake += sq_stats->wake; |
155 | s->tx_queue_dropped += sq_stats->dropped; | 156 | s->tx_queue_dropped += sq_stats->dropped; |
157 | s->tx_cqe_err += sq_stats->cqe_err; | ||
156 | s->tx_xmit_more += sq_stats->xmit_more; | 158 | s->tx_xmit_more += sq_stats->xmit_more; |
157 | s->tx_csum_partial_inner += sq_stats->csum_partial_inner; | 159 | s->tx_csum_partial_inner += sq_stats->csum_partial_inner; |
158 | s->tx_csum_none += sq_stats->csum_none; | 160 | s->tx_csum_none += sq_stats->csum_none; |
@@ -1103,6 +1105,7 @@ static const struct counter_desc sq_stats_desc[] = { | |||
1103 | { MLX5E_DECLARE_TX_STAT(struct mlx5e_sq_stats, wake) }, | 1105 | { MLX5E_DECLARE_TX_STAT(struct mlx5e_sq_stats, wake) }, |
1104 | { MLX5E_DECLARE_TX_STAT(struct mlx5e_sq_stats, dropped) }, | 1106 | { MLX5E_DECLARE_TX_STAT(struct mlx5e_sq_stats, dropped) }, |
1105 | { MLX5E_DECLARE_TX_STAT(struct mlx5e_sq_stats, xmit_more) }, | 1107 | { MLX5E_DECLARE_TX_STAT(struct mlx5e_sq_stats, xmit_more) }, |
1108 | { MLX5E_DECLARE_TX_STAT(struct mlx5e_sq_stats, cqe_err) }, | ||
1106 | }; | 1109 | }; |
1107 | 1110 | ||
1108 | static const struct counter_desc ch_stats_desc[] = { | 1111 | static const struct counter_desc ch_stats_desc[] = { |
diff --git a/drivers/net/ethernet/mellanox/mlx5/core/en_stats.h b/drivers/net/ethernet/mellanox/mlx5/core/en_stats.h index 43a72efa28c0..43dc808684c9 100644 --- a/drivers/net/ethernet/mellanox/mlx5/core/en_stats.h +++ b/drivers/net/ethernet/mellanox/mlx5/core/en_stats.h | |||
@@ -78,6 +78,7 @@ struct mlx5e_sw_stats { | |||
78 | u64 tx_queue_wake; | 78 | u64 tx_queue_wake; |
79 | u64 tx_queue_dropped; | 79 | u64 tx_queue_dropped; |
80 | u64 tx_xmit_more; | 80 | u64 tx_xmit_more; |
81 | u64 tx_cqe_err; | ||
81 | u64 rx_wqe_err; | 82 | u64 rx_wqe_err; |
82 | u64 rx_mpwqe_filler; | 83 | u64 rx_mpwqe_filler; |
83 | u64 rx_buff_alloc_err; | 84 | u64 rx_buff_alloc_err; |
@@ -197,6 +198,7 @@ struct mlx5e_sq_stats { | |||
197 | u64 stopped; | 198 | u64 stopped; |
198 | u64 wake; | 199 | u64 wake; |
199 | u64 dropped; | 200 | u64 dropped; |
201 | u64 cqe_err; | ||
200 | }; | 202 | }; |
201 | 203 | ||
202 | struct mlx5e_ch_stats { | 204 | struct mlx5e_ch_stats { |
diff --git a/drivers/net/ethernet/mellanox/mlx5/core/en_tx.c b/drivers/net/ethernet/mellanox/mlx5/core/en_tx.c index 11b4f1089d1c..88b5b7bfc9a9 100644 --- a/drivers/net/ethernet/mellanox/mlx5/core/en_tx.c +++ b/drivers/net/ethernet/mellanox/mlx5/core/en_tx.c | |||
@@ -417,6 +417,18 @@ netdev_tx_t mlx5e_xmit(struct sk_buff *skb, struct net_device *dev) | |||
417 | return mlx5e_sq_xmit(sq, skb, wqe, pi); | 417 | return mlx5e_sq_xmit(sq, skb, wqe, pi); |
418 | } | 418 | } |
419 | 419 | ||
420 | static void mlx5e_dump_error_cqe(struct mlx5e_txqsq *sq, | ||
421 | struct mlx5_err_cqe *err_cqe) | ||
422 | { | ||
423 | u32 ci = mlx5_cqwq_get_ci(&sq->cq.wq); | ||
424 | |||
425 | netdev_err(sq->channel->netdev, | ||
426 | "Error cqe on cqn 0x%x, ci 0x%x, sqn 0x%x, syndrome 0x%x, vendor syndrome 0x%x\n", | ||
427 | sq->cq.mcq.cqn, ci, sq->sqn, err_cqe->syndrome, | ||
428 | err_cqe->vendor_err_synd); | ||
429 | mlx5_dump_err_cqe(sq->cq.mdev, err_cqe); | ||
430 | } | ||
431 | |||
420 | bool mlx5e_poll_tx_cq(struct mlx5e_cq *cq, int napi_budget) | 432 | bool mlx5e_poll_tx_cq(struct mlx5e_cq *cq, int napi_budget) |
421 | { | 433 | { |
422 | struct mlx5e_txqsq *sq; | 434 | struct mlx5e_txqsq *sq; |
@@ -456,6 +468,13 @@ bool mlx5e_poll_tx_cq(struct mlx5e_cq *cq, int napi_budget) | |||
456 | 468 | ||
457 | wqe_counter = be16_to_cpu(cqe->wqe_counter); | 469 | wqe_counter = be16_to_cpu(cqe->wqe_counter); |
458 | 470 | ||
471 | if (unlikely(cqe->op_own >> 4 == MLX5_CQE_REQ_ERR)) { | ||
472 | if (!sq->stats.cqe_err) | ||
473 | mlx5e_dump_error_cqe(sq, | ||
474 | (struct mlx5_err_cqe *)cqe); | ||
475 | sq->stats.cqe_err++; | ||
476 | } | ||
477 | |||
459 | do { | 478 | do { |
460 | struct mlx5e_tx_wqe_info *wi; | 479 | struct mlx5e_tx_wqe_info *wi; |
461 | struct sk_buff *skb; | 480 | struct sk_buff *skb; |