net/mlx5: consolidate condition checks for TSO
authorYongseok Koh <yskoh@mellanox.com>
Wed, 27 Dec 2017 03:55:44 +0000 (19:55 -0800)
committerFerruh Yigit <ferruh.yigit@intel.com>
Tue, 16 Jan 2018 17:47:49 +0000 (18:47 +0100)
This change helps compiler to better optimize the code.

Signed-off-by: Yongseok Koh <yskoh@mellanox.com>
drivers/net/mlx5/mlx5_rxtx.c

index 1e0f5dc..5e58f1a 100644 (file)
@@ -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. */