[v2,1/3] app/testpmd: code refactory for macswap
Checks
Commit Message
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
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.
> -----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
@@ -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(ð_hdr->d_addr, &addr);
- ether_addr_copy(ð_hdr->s_addr, ð_hdr->d_addr);
- ether_addr_copy(&addr, ð_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
new file mode 100644
@@ -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(ð_hdr->d_addr, &addr);
+ ether_addr_copy(ð_hdr->s_addr, ð_hdr->d_addr);
+ ether_addr_copy(&addr, ð_hdr->s_addr);
+
+ mbuf_field_set(mb, ol_flags, txp->tx_vlan_id,
+ txp->tx_vlan_id_outer);
+ }
+}
+
+#endif /* _BPF_CMD_H_ */
+
new file mode 100644
@@ -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_ */
+