Patch "net/mlx5e: Fix wrong CQE decompression" has been added to the 4.10-stable tree
This is a note to let you know that I've just added the patch titled
net/mlx5e: Fix wrong CQE decompression
to the 4.10-stable tree which can be found at:
http://www.kernel.org/git/?p=linux/kernel/git/stable/stable-queue.git;a=summary
The filename of the patch is:
net-mlx5e-fix-wrong-cqe-decompression.patch
and it can be found in the queue-4.10 subdirectory.
If you, or anyone else, feels it should not be added to the stable tree, please let <[email protected]> know about it.
Quoted 1 line
From foo@baz Sat Mar 18 22:03:53 CST 2017
From: Tariq Toukan <[email protected]>
Date: Wed, 22 Feb 2017 17:20:16 +0200
Subject: net/mlx5e: Fix wrong CQE decompression
From: Tariq Toukan <[email protected]>
[ Upstream commit 36154be40a28e4afaa0416da2681d80b7e2ca319 ]
In cqe compression with striding RQ, the decompression of the CQE field wqe_counter was done with a wrong wraparound value.
This caused handling cqes with a wrong pointer to wqe (rx descriptor) and creating SKBs with wrong data, pointing to wrong (and already consumed) strides/pages.
The meaning of the CQE field wqe_counter in striding RQ holds the stride index instead of the WQE index. Hence, when decompressing a CQE, wqe_counter should have wrapped-around the number of strides in a single multi-packet WQE.
We dropped this wrap-around mask at all in CQE decompression of striding RQ. It is not needed as in such cases the CQE compression session would break because of different value of wqe_id field, starting a new compression session.
Tested:
ethtool -K ethxx lro off/on
ethtool --set-priv-flags ethxx rx_cqe_compress on super_netperf 16 {ipv4,ipv6} -t TCP_STREAM -m 50 -D verified no csum errors and no page refcount issues.
--- drivers/net/ethernet/mellanox/mlx5/core/en_rx.c | 13 ++++++------- 1 file changed, 6 insertions(+), 7 deletions(-)
drivers/net/ethernet/mellanox/mlx5/core/en_rx.c +6 -7
@@ -92,19 +92,18 @@ static inline void mlx5e_cqes_update_ownstatic inline void mlx5e_decompress_cqe (struct mlx5e_rq *rq,struct mlx5e_cq *cq,u32 cqcc) { -u16 wqe_cnt_step; - cq->title.byte_cnt = cq->mini_arr[cq->mini_arr_idx].byte_cnt; cq->title.check_sum = cq->mini_arr[cq->mini_arr_idx].checksum; cq->title.op_own &=0xf0 ; cq->title.op_own |=0x01 & (cqcc >> cq->wq.log_sz); cq->title.wqe_counter =cpu_to_be16 (cq->decmprs_wqe_counter); - wqe_cnt_step = - rq->wq_type ==MLX5_WQ_TYPE_LINKED_LIST_STRIDING_RQ ? -mpwrq_get_cqe_consumed_strides (&cq->title) :1 ; - cq->decmprs_wqe_counter = - (cq->decmprs_wqe_counter + wqe_cnt_step) & rq->wq.sz_m1; +if (rq->wq_type ==MLX5_WQ_TYPE_LINKED_LIST_STRIDING_RQ ) + cq->decmprs_wqe_counter += +mpwrq_get_cqe_consumed_strides (&cq->title); +else + cq->decmprs_wqe_counter = + (cq->decmprs_wqe_counter +1 ) & rq->wq.sz_m1; } static inline void mlx5e_decompress_cqe_no_hash(struct mlx5e_rq *rq,
Patches currently in stable-queue which might be from [email protected] are
queue-4.10/net-mlx5e-fix-broken-cqe-compression-initialization.patch queue-4.10/net-mlx5e-update-mpwqe-stride-size-when-modifying-cqe-compress-state.patch queue-4.10/net-mlx5e-do-not-reduce-lro-wqe-size-when-not-using-build_skb.patch queue-4.10/net-mlx5e-fix-wrong-cqe-decompression.patch