diff options
author | Saeed Mahameed <saeedm@mellanox.com> | 2016-08-28 18:13:44 -0400 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2016-08-28 23:24:15 -0400 |
commit | 8484f9ed13b26043be80ff5774506024956eae8f (patch) | |
tree | a66e4fc28ba7c4ce6a7d15cc4a4a551315044400 | |
parent | f2fde18c52a7367a8f6cf6855e2a7174e601c8ee (diff) |
net/mlx5e: Don't post fragmented MPWQE when RQ is disabled
ICO (Internal control operations) SQ (Send Queue) is closed/disabled
after RQ (Receive Queue). After RQ is closed an ICO SQ completion
might post a fragmented MPWQE (Multi Packet Work Queue Element) into
that RQ.
As on regular RQ post, check if we are allowed to post to that
RQ (RQ is enabled). Cleanup in-progress UMR MPWQE on mlx5e_free_rx_descs
if needed.
Fixes: bc77b240b3c5 ('net/mlx5e: Add fragmented memory support for RX multi packet WQE')
Signed-off-by: Saeed Mahameed <saeedm@mellanox.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
-rw-r--r-- | drivers/net/ethernet/mellanox/mlx5/core/en_main.c | 4 | ||||
-rw-r--r-- | drivers/net/ethernet/mellanox/mlx5/core/en_rx.c | 6 |
2 files changed, 10 insertions, 0 deletions
diff --git a/drivers/net/ethernet/mellanox/mlx5/core/en_main.c b/drivers/net/ethernet/mellanox/mlx5/core/en_main.c index 2463eba75125..e259eaa18f55 100644 --- a/drivers/net/ethernet/mellanox/mlx5/core/en_main.c +++ b/drivers/net/ethernet/mellanox/mlx5/core/en_main.c | |||
@@ -534,6 +534,10 @@ static void mlx5e_free_rx_descs(struct mlx5e_rq *rq) | |||
534 | __be16 wqe_ix_be; | 534 | __be16 wqe_ix_be; |
535 | u16 wqe_ix; | 535 | u16 wqe_ix; |
536 | 536 | ||
537 | /* UMR WQE (if in progress) is always at wq->head */ | ||
538 | if (test_bit(MLX5E_RQ_STATE_UMR_WQE_IN_PROGRESS, &rq->state)) | ||
539 | mlx5e_free_rx_fragmented_mpwqe(rq, &rq->wqe_info[wq->head]); | ||
540 | |||
537 | while (!mlx5_wq_ll_is_empty(wq)) { | 541 | while (!mlx5_wq_ll_is_empty(wq)) { |
538 | wqe_ix_be = *wq->tail_next; | 542 | wqe_ix_be = *wq->tail_next; |
539 | wqe_ix = be16_to_cpu(wqe_ix_be); | 543 | wqe_ix = be16_to_cpu(wqe_ix_be); |
diff --git a/drivers/net/ethernet/mellanox/mlx5/core/en_rx.c b/drivers/net/ethernet/mellanox/mlx5/core/en_rx.c index fee1e47769a8..b6f8ebbdb487 100644 --- a/drivers/net/ethernet/mellanox/mlx5/core/en_rx.c +++ b/drivers/net/ethernet/mellanox/mlx5/core/en_rx.c | |||
@@ -506,6 +506,12 @@ void mlx5e_post_rx_fragmented_mpwqe(struct mlx5e_rq *rq) | |||
506 | struct mlx5e_rx_wqe *wqe = mlx5_wq_ll_get_wqe(wq, wq->head); | 506 | struct mlx5e_rx_wqe *wqe = mlx5_wq_ll_get_wqe(wq, wq->head); |
507 | 507 | ||
508 | clear_bit(MLX5E_RQ_STATE_UMR_WQE_IN_PROGRESS, &rq->state); | 508 | clear_bit(MLX5E_RQ_STATE_UMR_WQE_IN_PROGRESS, &rq->state); |
509 | |||
510 | if (unlikely(test_bit(MLX5E_RQ_STATE_FLUSH, &rq->state))) { | ||
511 | mlx5e_free_rx_fragmented_mpwqe(rq, &rq->wqe_info[wq->head]); | ||
512 | return; | ||
513 | } | ||
514 | |||
509 | mlx5_wq_ll_push(wq, be16_to_cpu(wqe->next.next_wqe_index)); | 515 | mlx5_wq_ll_push(wq, be16_to_cpu(wqe->next.next_wqe_index)); |
510 | rq->stats.mpwqe_frag++; | 516 | rq->stats.mpwqe_frag++; |
511 | 517 | ||