[dpdk-dev] [PATCH] ixgbe: prefetch cacheline after pointer becomes valid
On Thu, Sep 24, 2015 at 05:23:26PM -0700, Zoltan Kiss wrote: > At the original point the rx_pkts[pos( + n)] pointers are not initialized, so > the code is prefetching random data. > > Signed-off-by: Zoltan Kiss > Apart from the whitespace issues pointed out by John, this fix looks ok and testing shows no performance impact (as expected). /Bruce
[dpdk-dev] [PATCH] ixgbe: prefetch cacheline after pointer becomes valid
> -Original Message- > From: dev [mailto:dev-bounces at dpdk.org] On Behalf Of Zoltan Kiss > Sent: Friday, September 25, 2015 1:23 AM > To: dev at dpdk.org > Subject: [dpdk-dev] [PATCH] ixgbe: prefetch cacheline after pointer > becomes valid > > + if (split_packet) { > + rte_prefetch0(&rx_pkts[pos]->cacheline1); > + rte_prefetch0(&rx_pkts[pos + 1]->cacheline1); > + rte_prefetch0(&rx_pkts[pos + 2]->cacheline1); > + rte_prefetch0(&rx_pkts[pos + 3]->cacheline1); > + } > + > /* A* mask out 0~3 bits RSS type */ > descs[3] = _mm_and_si128(descs0[3], desc_mask); > descs[2] = _mm_and_si128(descs0[2], desc_mask); Hi, This patch doesn't apply cleanly. It looks like all the tabs have been replaced with spaces. John.
[dpdk-dev] [PATCH] ixgbe: prefetch cacheline after pointer becomes valid
On 25/09/15 04:47, Mcnamara, John wrote: >> -Original Message- >> From: dev [mailto:dev-bounces at dpdk.org] On Behalf Of Zoltan Kiss >> Sent: Friday, September 25, 2015 1:23 AM >> To: dev at dpdk.org >> Subject: [dpdk-dev] [PATCH] ixgbe: prefetch cacheline after pointer >> becomes valid >> >> + if (split_packet) { >> + rte_prefetch0(&rx_pkts[pos]->cacheline1); >> + rte_prefetch0(&rx_pkts[pos + 1]->cacheline1); >> + rte_prefetch0(&rx_pkts[pos + 2]->cacheline1); >> + rte_prefetch0(&rx_pkts[pos + 3]->cacheline1); >> + } >> + >> /* A* mask out 0~3 bits RSS type */ >> descs[3] = _mm_and_si128(descs0[3], desc_mask); >> descs[2] = _mm_and_si128(descs0[2], desc_mask); > Hi, > > This patch doesn't apply cleanly. It looks like all the tabs have been > replaced with spaces. Sorry, my bad, I'll resend > > John. > >
[dpdk-dev] [PATCH] ixgbe: prefetch cacheline after pointer becomes valid
At the original point the rx_pkts[pos( + n)] pointers are not initialized, so the code is prefetching random data. Signed-off-by: Zoltan Kiss diff --git a/drivers/net/ixgbe/ixgbe_rxtx_vec.c b/drivers/net/ixgbe/ixgbe_rxtx_vec.c index 3c6d8c5..ccd93c7 100644 --- a/drivers/net/ixgbe/ixgbe_rxtx_vec.c +++ b/drivers/net/ixgbe/ixgbe_rxtx_vec.c @@ -284,13 +284,6 @@ _recv_raw_pkts_vec(struct ixgbe_rx_queue *rxq, struct rte_mbuf **rx_pkts, __m128i zero, staterr, sterr_tmp1, sterr_tmp2; __m128i mbp1, mbp2; /* two mbuf pointer in one XMM reg. */ - if (split_packet) { - rte_prefetch0(&rx_pkts[pos]->cacheline1); - rte_prefetch0(&rx_pkts[pos + 1]->cacheline1); - rte_prefetch0(&rx_pkts[pos + 2]->cacheline1); - rte_prefetch0(&rx_pkts[pos + 3]->cacheline1); - } - /* B.1 load 1 mbuf point */ mbp1 = _mm_loadu_si128((__m128i *)&sw_ring[pos]); @@ -312,6 +305,13 @@ _recv_raw_pkts_vec(struct ixgbe_rx_queue *rxq, struct rte_mbuf **rx_pkts, /* B.2 copy 2 mbuf point into rx_pkts */ _mm_storeu_si128((__m128i *)&rx_pkts[pos+2], mbp2); + if (split_packet) { + rte_prefetch0(&rx_pkts[pos]->cacheline1); + rte_prefetch0(&rx_pkts[pos + 1]->cacheline1); + rte_prefetch0(&rx_pkts[pos + 2]->cacheline1); + rte_prefetch0(&rx_pkts[pos + 3]->cacheline1); + } + /* A* mask out 0~3 bits RSS type */ descs[3] = _mm_and_si128(descs0[3], desc_mask); descs[2] = _mm_and_si128(descs0[2], desc_mask);