Hi Qi, > -----Original Message----- > From: dev [mailto:dev-boun...@dpdk.org] On Behalf Of Qi Zhang > Sent: Tuesday, November 20, 2018 4:46 AM > To: Richardson, Bruce <bruce.richard...@intel.com>; Wiles, Keith > <keith.wi...@intel.com> > Cc: dev@dpdk.org; Lu, Wenzhuo <wenzhuo...@intel.com>; Iremonger, Bernard > <bernard.iremon...@intel.com>; Zhang, Qi Z > <qi.z.zh...@intel.com>; sta...@dpdk.org > Subject: [dpdk-dev] [PATCH] app/testpmd: improve MAC swap performance > > The patch optimizes the mac swap operation by taking advantage > of SSE instructions, it only impacts x86 platform. > > Cc: sta...@dpdk.org > > Signed-off-by: Qi Zhang <qi.z.zh...@intel.com> > --- > app/test-pmd/macswap.c | 16 +++++++++++++++- > 1 file changed, 15 insertions(+), 1 deletion(-) > > diff --git a/app/test-pmd/macswap.c b/app/test-pmd/macswap.c > index a8384d5b8..0722782b0 100644 > --- a/app/test-pmd/macswap.c > +++ b/app/test-pmd/macswap.c > @@ -78,7 +78,6 @@ pkt_burst_mac_swap(struct fwd_stream *fs) > 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; > @@ -95,6 +94,15 @@ pkt_burst_mac_swap(struct fwd_stream *fs) > start_tsc = rte_rdtsc(); > #endif > > +#ifdef RTE_ARCH_X86 > + __m128i addr; > + __m128i shfl_msk = _mm_set_epi8(15, 14, 13, 12, > + 5, 4, 3, 2, > + 1, 0, 11, 10, > + 9, 8, 7, 6); > +#else > + struct ether_addr addr; > +#endif
I think it would better to place IA specific code into a separate fnction (and probably into a separate .h file). BTW, just curious what % of improvement it gives? Konstantin > /* > * Receive a burst of packets and forward them. > */ > @@ -123,9 +131,15 @@ pkt_burst_mac_swap(struct fwd_stream *fs) > eth_hdr = rte_pktmbuf_mtod(mb, struct ether_hdr *); > > /* Swap dest and src mac addresses. */ > +#ifdef RTE_ARCH_X86 > + addr = _mm_loadu_si128((__m128i *)eth_hdr); > + addr = _mm_shuffle_epi8(addr, shfl_msk); > + _mm_storeu_si128((__m128i *)eth_hdr, addr); > +#else > ether_addr_copy(ð_hdr->d_addr, &addr); > ether_addr_copy(ð_hdr->s_addr, ð_hdr->d_addr); > ether_addr_copy(&addr, ð_hdr->s_addr); > +#endif > > mb->ol_flags &= IND_ATTACHED_MBUF | EXT_ATTACHED_MBUF; > mb->ol_flags |= ol_flags; > -- > 2.13.6