[dpdk-dev] [PATCH 2/5] net/mlx5: consolidate condition checks for TSO

Yongseok Koh yskoh at mellanox.com
Wed Dec 27 04:55:44 CET 2017


This change helps compileer to better optimize the code.

Signed-off-by: Yongseok Koh <yskoh at mellanox.com>
---
 drivers/net/mlx5/mlx5_rxtx.c | 126 ++++++++++++++++++++-----------------------
 1 file changed, 58 insertions(+), 68 deletions(-)

diff --git a/drivers/net/mlx5/mlx5_rxtx.c b/drivers/net/mlx5/mlx5_rxtx.c
index 1e0f5dc52..5e58f1afd 100644
--- a/drivers/net/mlx5/mlx5_rxtx.c
+++ b/drivers/net/mlx5/mlx5_rxtx.c
@@ -441,77 +441,67 @@ mlx5_tx_burst(void *dpdk_txq, struct rte_mbuf **pkts, uint16_t pkts_n)
 			addr += pkt_inline_sz;
 		}
 		raw += MLX5_WQE_DWORD_SIZE;
-		if (txq->tso_en) {
-			tso = buf->ol_flags & PKT_TX_TCP_SEG;
-			if (tso) {
-				uintptr_t end = (uintptr_t)
-						(((uintptr_t)txq->wqes) +
-						(1 << txq->wqe_n) *
-						MLX5_WQE_SIZE);
-				unsigned int copy_b;
-				uint8_t vlan_sz = (buf->ol_flags &
-						  PKT_TX_VLAN_PKT) ? 4 : 0;
-				const uint64_t is_tunneled =
-							buf->ol_flags &
-							(PKT_TX_TUNNEL_GRE |
-							 PKT_TX_TUNNEL_VXLAN);
-
-				tso_header_sz = buf->l2_len + vlan_sz +
-						buf->l3_len + buf->l4_len;
-				tso_segsz = buf->tso_segsz;
-				if (unlikely(tso_segsz == 0)) {
-					txq->stats.oerrors++;
-					break;
-				}
-				if (is_tunneled	&& txq->tunnel_en) {
-					tso_header_sz += buf->outer_l2_len +
-							 buf->outer_l3_len;
-					cs_flags |= MLX5_ETH_WQE_L4_INNER_CSUM;
-				} else {
-					cs_flags |= MLX5_ETH_WQE_L4_CSUM;
-				}
-				if (unlikely(tso_header_sz >
-					     MLX5_MAX_TSO_HEADER)) {
-					txq->stats.oerrors++;
+		tso = txq->tso_en && (buf->ol_flags & PKT_TX_TCP_SEG);
+		if (tso) {
+			uintptr_t end =
+				(uintptr_t)(((uintptr_t)txq->wqes) +
+					    (1 << txq->wqe_n) * MLX5_WQE_SIZE);
+			unsigned int copy_b;
+			uint8_t vlan_sz =
+				(buf->ol_flags & PKT_TX_VLAN_PKT) ? 4 : 0;
+			const uint64_t is_tunneled =
+				buf->ol_flags & (PKT_TX_TUNNEL_GRE |
+						 PKT_TX_TUNNEL_VXLAN);
+
+			tso_header_sz = buf->l2_len + vlan_sz +
+					buf->l3_len + buf->l4_len;
+			tso_segsz = buf->tso_segsz;
+			if (unlikely(tso_segsz == 0)) {
+				txq->stats.oerrors++;
+				break;
+			}
+			if (is_tunneled	&& txq->tunnel_en) {
+				tso_header_sz += buf->outer_l2_len +
+						 buf->outer_l3_len;
+				cs_flags |= MLX5_ETH_WQE_L4_INNER_CSUM;
+			} else {
+				cs_flags |= MLX5_ETH_WQE_L4_CSUM;
+			}
+			if (unlikely(tso_header_sz > MLX5_MAX_TSO_HEADER)) {
+				txq->stats.oerrors++;
+				break;
+			}
+			copy_b = tso_header_sz - pkt_inline_sz;
+			/* First seg must contain all headers. */
+			assert(copy_b <= length);
+			if (copy_b && ((end - (uintptr_t)raw) > copy_b)) {
+				uint16_t n = (MLX5_WQE_DS(copy_b) - 1 + 3) / 4;
+
+				if (unlikely(max_wqe < n))
 					break;
-				}
-				copy_b = tso_header_sz - pkt_inline_sz;
-				/* First seg must contain all headers. */
-				assert(copy_b <= length);
-				if (copy_b &&
-				   ((end - (uintptr_t)raw) > copy_b)) {
-					uint16_t n = (MLX5_WQE_DS(copy_b) -
-						      1 + 3) / 4;
-
-					if (unlikely(max_wqe < n))
-						break;
-					max_wqe -= n;
-					rte_memcpy((void *)raw,
-						   (void *)addr, copy_b);
-					addr += copy_b;
-					length -= copy_b;
-					/* Include padding for TSO header. */
-					copy_b = MLX5_WQE_DS(copy_b) *
-						 MLX5_WQE_DWORD_SIZE;
-					pkt_inline_sz += copy_b;
-					raw += copy_b;
-				} else {
-					/* NOP WQE. */
-					wqe->ctrl = (rte_v128u32_t){
-						     rte_cpu_to_be_32(
-							txq->wqe_ci << 8),
-						     rte_cpu_to_be_32(
-							txq->qp_num_8s | 1),
-						     0,
-						     0,
-					};
-					ds = 1;
+				max_wqe -= n;
+				rte_memcpy((void *)raw, (void *)addr, copy_b);
+				addr += copy_b;
+				length -= copy_b;
+				/* Include padding for TSO header. */
+				copy_b = MLX5_WQE_DS(copy_b) *
+					 MLX5_WQE_DWORD_SIZE;
+				pkt_inline_sz += copy_b;
+				raw += copy_b;
+			} else {
+				/* NOP WQE. */
+				wqe->ctrl = (rte_v128u32_t){
+					rte_cpu_to_be_32(txq->wqe_ci << 8),
+					rte_cpu_to_be_32(txq->qp_num_8s | 1),
+					0,
+					0,
+				};
+				ds = 1;
 #ifdef MLX5_PMD_SOFT_COUNTERS
-					total_length = 0;
+				total_length = 0;
 #endif
-					k++;
-					goto next_wqe;
-				}
+				k++;
+				goto next_wqe;
 			}
 		}
 		/* Inline if enough room. */
-- 
2.11.0



More information about the dev mailing list