[v2,1/3] app/testpmd: code refactory for macswap

Message ID 20181122173805.79555-2-qi.z.zhang@intel.com (mailing list archive)
State Superseded, archived
Delegated to: Ferruh Yigit
Headers
Series improve MAC swap performance |

Checks

Context Check Description
ci/checkpatch success coding style OK
ci/Intel-compilation success Compilation OK
ci/mellanox-Performance-Testing success Performance Testing PASS
ci/intel-Performance-Testing success Performance Testing PASS

Commit Message

Qi Zhang Nov. 22, 2018, 5:38 p.m. UTC
  Move macswap workload to dedicate function, so we can further enable
platform specific optimized version.

Signed-off-by: Qi Zhang <qi.z.zhang@intel.com>
---
 app/test-pmd/macswap.c        | 32 ++------------------------------
 app/test-pmd/macswap.h        | 40 ++++++++++++++++++++++++++++++++++++++++
 app/test-pmd/macswap_common.h | 36 ++++++++++++++++++++++++++++++++++++
 3 files changed, 78 insertions(+), 30 deletions(-)
 create mode 100644 app/test-pmd/macswap.h
 create mode 100644 app/test-pmd/macswap_common.h
  

Comments

Ferruh Yigit Dec. 10, 2018, 5:44 p.m. UTC | #1
On 11/22/2018 5:38 PM, Qi Zhang wrote:
> Move macswap workload to dedicate function, so we can further enable
> platform specific optimized version.
> 
> Signed-off-by: Qi Zhang <qi.z.zhang@intel.com>

<...>

> @@ -0,0 +1,40 @@
> +/* SPDX-License-Identifier: BSD-3-Clause
> + * Copyright(c) 2018 Intel Corporation
> + */
> +
> +#ifndef _L2FWD_H_
> +#define _L2FWD_H_

Looks like copy-paste artifact, there are a few more in patchset.

<...>

> @@ -0,0 +1,36 @@
> +/* SPDX-License-Identifier: BSD-3-Clause
> + * Copyright(c) 2018 Intel Corporation
> + */
> +
> +#ifndef _L2FWD_COMMON_H_
> +#define _L2FWD_COMMON_H_
> +
> +static inline uint64_t
> +ol_flags_init(uint64_t tx_offload)
> +{
> +	uint64_t ol_flags = 0;
> +
> +	ol_flags |= (tx_offload & DEV_TX_OFFLOAD_VLAN_INSERT) ?
> +			PKT_TX_VLAN_PKT : 0;

'PKT_TX_VLAN_PKT' is depreciated and replaced with 'PKT_TX_VLAN'. I think it is
better to keep as it is in this patch, since mainly it copies from one place to
another, but can you update this in new patch in this patchset?

> +	ol_flags |= (tx_offload & DEV_TX_OFFLOAD_QINQ_INSERT) ?
> +			PKT_TX_QINQ_PKT : 0;

Same here, 'PKT_TX_QINQ_PKT' replaced with 'PKT_TX_QINQ'.

> +	ol_flags |= (tx_offload & DEV_TX_OFFLOAD_MACSEC_INSERT) ?
> +			PKT_TX_MACSEC : 0;
> +
> +	return ol_flags;
> +}
> +
> +static inline void
> +mbuf_field_set(struct rte_mbuf *mb, uint64_t ol_flags,
> +		uint16_t vlan, uint16_t vlan_outer)
> +{
> +	mb->ol_flags &= IND_ATTACHED_MBUF | EXT_ATTACHED_MBUF;

I guess above line is to prevent those bits overwritten, but with '|='
assignment below I think they will be preserved already, do we need above line?
cc'ed Yongseok.

> +	mb->ol_flags |= ol_flags;
> +	mb->l2_len = sizeof(struct ether_hdr);
> +	mb->l3_len = sizeof(struct ipv4_hdr);
> +	mb->vlan_tci = vlan;
> +	mb->vlan_tci_outer = vlan_outer;

Setting 'vlan_tci' or 'vlan_tci_outer' makes sense only if 'PKT_TX_VLAN' and
'PKT_TX_QINQ' set, since there is already an check for them above, does it make
sense to do these assignment in them, for better performance.
  
Qi Zhang Dec. 11, 2018, 4:02 a.m. UTC | #2
> -----Original Message-----
> From: Yigit, Ferruh
> Sent: Tuesday, December 11, 2018 1:44 AM
> To: Zhang, Qi Z <qi.z.zhang@intel.com>; Richardson, Bruce
> <bruce.richardson@intel.com>; Wiles, Keith <keith.wiles@intel.com>; Ananyev,
> Konstantin <konstantin.ananyev@intel.com>
> Cc: dev@dpdk.org; Lu, Wenzhuo <wenzhuo.lu@intel.com>; Iremonger, Bernard
> <bernard.iremonger@intel.com>; Yongseok Koh <yskoh@mellanox.com>
> Subject: Re: [dpdk-dev] [PATCH v2 1/3] app/testpmd: code refactory for
> macswap
> 
> On 11/22/2018 5:38 PM, Qi Zhang wrote:
> > Move macswap workload to dedicate function, so we can further enable
> > platform specific optimized version.
> >
> > Signed-off-by: Qi Zhang <qi.z.zhang@intel.com>
> 
> <...>
> 
> > @@ -0,0 +1,40 @@
> > +/* SPDX-License-Identifier: BSD-3-Clause
> > + * Copyright(c) 2018 Intel Corporation  */
> > +
> > +#ifndef _L2FWD_H_
> > +#define _L2FWD_H_
> 
> Looks like copy-paste artifact, there are a few more in patchset.
> 
> <...>
> 
> > @@ -0,0 +1,36 @@
> > +/* SPDX-License-Identifier: BSD-3-Clause
> > + * Copyright(c) 2018 Intel Corporation  */
> > +
> > +#ifndef _L2FWD_COMMON_H_
> > +#define _L2FWD_COMMON_H_
> > +
> > +static inline uint64_t
> > +ol_flags_init(uint64_t tx_offload)
> > +{
> > +	uint64_t ol_flags = 0;
> > +
> > +	ol_flags |= (tx_offload & DEV_TX_OFFLOAD_VLAN_INSERT) ?
> > +			PKT_TX_VLAN_PKT : 0;
> 
> 'PKT_TX_VLAN_PKT' is depreciated and replaced with 'PKT_TX_VLAN'. I think it
> is better to keep as it is in this patch, since mainly it copies from one place to
> another, but can you update this in new patch in this patchset?

Ok, I will replace.

> 
> > +	ol_flags |= (tx_offload & DEV_TX_OFFLOAD_QINQ_INSERT) ?
> > +			PKT_TX_QINQ_PKT : 0;
> 
> Same here, 'PKT_TX_QINQ_PKT' replaced with 'PKT_TX_QINQ'.
> 
> > +	ol_flags |= (tx_offload & DEV_TX_OFFLOAD_MACSEC_INSERT) ?
> > +			PKT_TX_MACSEC : 0;
> > +
> > +	return ol_flags;
> > +}
> > +
> > +static inline void
> > +mbuf_field_set(struct rte_mbuf *mb, uint64_t ol_flags,
> > +		uint16_t vlan, uint16_t vlan_outer) {
> > +	mb->ol_flags &= IND_ATTACHED_MBUF | EXT_ATTACHED_MBUF;
> 
> I guess above line is to prevent those bits overwritten, but with '|='
> assignment below I think they will be preserved already, do we need above line?
> cc'ed Yongseok.

I think above line also clean up other bits besides IND_ATTACHED_MBUF | EXT_ATTACHED_MBUF
But I don't know if it is necessary, so I just keep it the same way as before.

> 
> > +	mb->ol_flags |= ol_flags;
> > +	mb->l2_len = sizeof(struct ether_hdr);
> > +	mb->l3_len = sizeof(struct ipv4_hdr);
> > +	mb->vlan_tci = vlan;
> > +	mb->vlan_tci_outer = vlan_outer;
> 
> Setting 'vlan_tci' or 'vlan_tci_outer' makes sense only if 'PKT_TX_VLAN' and
> 'PKT_TX_QINQ' set, since there is already an check for them above, does it
> make sense to do these assignment in them, for better performance.

Good point, we can skip these memory write if PKT_TX_VLAN and PKT_TX_QINQ is not set.

Thanks
Qi
  

Patch

diff --git a/app/test-pmd/macswap.c b/app/test-pmd/macswap.c
index a8384d5b8..849194fe2 100644
--- a/app/test-pmd/macswap.c
+++ b/app/test-pmd/macswap.c
@@ -66,6 +66,7 @@ 
 #include <rte_flow.h>
 
 #include "testpmd.h"
+#include "macswap.h"
 
 /*
  * MAC swap forwarding mode: Swap the source and the destination Ethernet
@@ -76,15 +77,9 @@  pkt_burst_mac_swap(struct fwd_stream *fs)
 {
 	struct rte_mbuf  *pkts_burst[MAX_PKT_BURST];
 	struct rte_port  *txp;
-	struct rte_mbuf  *mb;
-	struct ether_hdr *eth_hdr;
-	struct ether_addr addr;
 	uint16_t nb_rx;
 	uint16_t nb_tx;
-	uint16_t i;
 	uint32_t retry;
-	uint64_t ol_flags = 0;
-	uint64_t tx_offloads;
 #ifdef RTE_TEST_PMD_RECORD_CORE_CYCLES
 	uint64_t start_tsc;
 	uint64_t end_tsc;
@@ -108,32 +103,9 @@  pkt_burst_mac_swap(struct fwd_stream *fs)
 #endif
 	fs->rx_packets += nb_rx;
 	txp = &ports[fs->tx_port];
-	tx_offloads = txp->dev_conf.txmode.offloads;
-	if (tx_offloads	& DEV_TX_OFFLOAD_VLAN_INSERT)
-		ol_flags = PKT_TX_VLAN_PKT;
-	if (tx_offloads & DEV_TX_OFFLOAD_QINQ_INSERT)
-		ol_flags |= PKT_TX_QINQ_PKT;
-	if (tx_offloads & DEV_TX_OFFLOAD_MACSEC_INSERT)
-		ol_flags |= PKT_TX_MACSEC;
-	for (i = 0; i < nb_rx; i++) {
-		if (likely(i < nb_rx - 1))
-			rte_prefetch0(rte_pktmbuf_mtod(pkts_burst[i + 1],
-						       void *));
-		mb = pkts_burst[i];
-		eth_hdr = rte_pktmbuf_mtod(mb, struct ether_hdr *);
 
-		/* Swap dest and src mac addresses. */
-		ether_addr_copy(&eth_hdr->d_addr, &addr);
-		ether_addr_copy(&eth_hdr->s_addr, &eth_hdr->d_addr);
-		ether_addr_copy(&addr, &eth_hdr->s_addr);
+	do_macswap(pkts_burst, nb_rx, txp);
 
-		mb->ol_flags &= IND_ATTACHED_MBUF | EXT_ATTACHED_MBUF;
-		mb->ol_flags |= ol_flags;
-		mb->l2_len = sizeof(struct ether_hdr);
-		mb->l3_len = sizeof(struct ipv4_hdr);
-		mb->vlan_tci = txp->tx_vlan_id;
-		mb->vlan_tci_outer = txp->tx_vlan_id_outer;
-	}
 	nb_tx = rte_eth_tx_burst(fs->tx_port, fs->tx_queue, pkts_burst, nb_rx);
 	/*
 	 * Retry if necessary
diff --git a/app/test-pmd/macswap.h b/app/test-pmd/macswap.h
new file mode 100644
index 000000000..bc8a95626
--- /dev/null
+++ b/app/test-pmd/macswap.h
@@ -0,0 +1,40 @@ 
+/* SPDX-License-Identifier: BSD-3-Clause
+ * Copyright(c) 2018 Intel Corporation
+ */
+
+#ifndef _L2FWD_H_
+#define _L2FWD_H_
+
+#include "macswap_common.h"
+
+static inline void
+do_macswap(struct rte_mbuf *pkts[], uint16_t nb,
+		struct rte_port *txp)
+{
+	struct ether_hdr *eth_hdr;
+	struct rte_mbuf *mb;
+	struct ether_addr addr;
+	uint64_t ol_flags;
+	int i;
+
+	ol_flags = ol_flags_init(txp->dev_conf.txmode.offloads);
+
+	for (i = 0; i < nb; i++) {
+		if (likely(i < nb - 1))
+			rte_prefetch0(rte_pktmbuf_mtod(pkts[i+1], void *));
+		mb = pkts[i];
+
+		eth_hdr = rte_pktmbuf_mtod(mb, struct ether_hdr *);
+
+		/* Swap dest and src mac addresses. */
+		ether_addr_copy(&eth_hdr->d_addr, &addr);
+		ether_addr_copy(&eth_hdr->s_addr, &eth_hdr->d_addr);
+		ether_addr_copy(&addr, &eth_hdr->s_addr);
+
+		mbuf_field_set(mb, ol_flags, txp->tx_vlan_id,
+				txp->tx_vlan_id_outer);
+	}
+}
+
+#endif /* _BPF_CMD_H_ */
+
diff --git a/app/test-pmd/macswap_common.h b/app/test-pmd/macswap_common.h
new file mode 100644
index 000000000..2c01cbc8f
--- /dev/null
+++ b/app/test-pmd/macswap_common.h
@@ -0,0 +1,36 @@ 
+/* SPDX-License-Identifier: BSD-3-Clause
+ * Copyright(c) 2018 Intel Corporation
+ */
+
+#ifndef _L2FWD_COMMON_H_
+#define _L2FWD_COMMON_H_
+
+static inline uint64_t
+ol_flags_init(uint64_t tx_offload)
+{
+	uint64_t ol_flags = 0;
+
+	ol_flags |= (tx_offload & DEV_TX_OFFLOAD_VLAN_INSERT) ?
+			PKT_TX_VLAN_PKT : 0;
+	ol_flags |= (tx_offload & DEV_TX_OFFLOAD_QINQ_INSERT) ?
+			PKT_TX_QINQ_PKT : 0;
+	ol_flags |= (tx_offload & DEV_TX_OFFLOAD_MACSEC_INSERT) ?
+			PKT_TX_MACSEC : 0;
+
+	return ol_flags;
+}
+
+static inline void
+mbuf_field_set(struct rte_mbuf *mb, uint64_t ol_flags,
+		uint16_t vlan, uint16_t vlan_outer)
+{
+	mb->ol_flags &= IND_ATTACHED_MBUF | EXT_ATTACHED_MBUF;
+	mb->ol_flags |= ol_flags;
+	mb->l2_len = sizeof(struct ether_hdr);
+	mb->l3_len = sizeof(struct ipv4_hdr);
+	mb->vlan_tci = vlan;
+	mb->vlan_tci_outer = vlan_outer;
+}
+
+#endif /* _BPF_CMD_H_ */
+