app/testpmd: use Tx preparation in checksum engine
authorTomasz Kulasek <tomaszx.kulasek@intel.com>
Fri, 23 Dec 2016 18:40:54 +0000 (19:40 +0100)
committerThomas Monjalon <thomas.monjalon@6wind.com>
Wed, 4 Jan 2017 19:40:28 +0000 (20:40 +0100)
Since all current drivers supports Tx preparation API, it is used
in csum forwarding engine by default for all drivers.

Adding additional step to the csum engine costs about 3-4% of performance
drop, on my setup with ixgbe driver. It's caused mostly by the need
of reaccessing and modification of packet data.

Signed-off-by: Tomasz Kulasek <tomaszx.kulasek@intel.com>
Acked-by: Konstantin Ananyev <konstantin.ananyev@intel.com>
app/test-pmd/csumonly.c

index dd67ebf..88cc842 100644 (file)
@@ -112,15 +112,6 @@ struct simple_gre_hdr {
        uint16_t proto;
 } __attribute__((__packed__));
 
-static uint16_t
-get_psd_sum(void *l3_hdr, uint16_t ethertype, uint64_t ol_flags)
-{
-       if (ethertype == _htons(ETHER_TYPE_IPv4))
-               return rte_ipv4_phdr_cksum(l3_hdr, ol_flags);
-       else /* assume ethertype == ETHER_TYPE_IPv6 */
-               return rte_ipv6_phdr_cksum(l3_hdr, ol_flags);
-}
-
 static uint16_t
 get_udptcp_checksum(void *l3_hdr, void *l4_hdr, uint16_t ethertype)
 {
@@ -371,11 +362,9 @@ process_inner_cksums(void *l3_hdr, const struct testpmd_offload_info *info,
                /* do not recalculate udp cksum if it was 0 */
                if (udp_hdr->dgram_cksum != 0) {
                        udp_hdr->dgram_cksum = 0;
-                       if (testpmd_ol_flags & TESTPMD_TX_OFFLOAD_UDP_CKSUM) {
+                       if (testpmd_ol_flags & TESTPMD_TX_OFFLOAD_UDP_CKSUM)
                                ol_flags |= PKT_TX_UDP_CKSUM;
-                               udp_hdr->dgram_cksum = get_psd_sum(l3_hdr,
-                                       info->ethertype, ol_flags);
-                       } else {
+                       else {
                                udp_hdr->dgram_cksum =
                                        get_udptcp_checksum(l3_hdr, udp_hdr,
                                                info->ethertype);
@@ -384,15 +373,11 @@ process_inner_cksums(void *l3_hdr, const struct testpmd_offload_info *info,
        } else if (info->l4_proto == IPPROTO_TCP) {
                tcp_hdr = (struct tcp_hdr *)((char *)l3_hdr + info->l3_len);
                tcp_hdr->cksum = 0;
-               if (tso_segsz) {
+               if (tso_segsz)
                        ol_flags |= PKT_TX_TCP_SEG;
-                       tcp_hdr->cksum = get_psd_sum(l3_hdr, info->ethertype,
-                               ol_flags);
-               } else if (testpmd_ol_flags & TESTPMD_TX_OFFLOAD_TCP_CKSUM) {
+               else if (testpmd_ol_flags & TESTPMD_TX_OFFLOAD_TCP_CKSUM)
                        ol_flags |= PKT_TX_TCP_CKSUM;
-                       tcp_hdr->cksum = get_psd_sum(l3_hdr, info->ethertype,
-                               ol_flags);
-               } else {
+               else {
                        tcp_hdr->cksum =
                                get_udptcp_checksum(l3_hdr, tcp_hdr,
                                        info->ethertype);
@@ -649,6 +634,7 @@ pkt_burst_checksum_forward(struct fwd_stream *fs)
        void *l3_hdr = NULL, *outer_l3_hdr = NULL; /* can be IPv4 or IPv6 */
        uint16_t nb_rx;
        uint16_t nb_tx;
+       uint16_t nb_prep;
        uint16_t i;
        uint64_t rx_ol_flags, tx_ol_flags;
        uint16_t testpmd_ol_flags;
@@ -858,7 +844,16 @@ pkt_burst_checksum_forward(struct fwd_stream *fs)
                        printf("\n");
                }
        }
-       nb_tx = rte_eth_tx_burst(fs->tx_port, fs->tx_queue, pkts_burst, nb_rx);
+
+       nb_prep = rte_eth_tx_prepare(fs->tx_port, fs->tx_queue,
+                       pkts_burst, nb_rx);
+       if (nb_prep != nb_rx)
+               printf("Preparing packet burst to transmit failed: %s\n",
+                               rte_strerror(rte_errno));
+
+       nb_tx = rte_eth_tx_burst(fs->tx_port, fs->tx_queue, pkts_burst,
+                       nb_prep);
+
        /*
         * Retry if necessary
         */