[dpdk-dev] [PATCH] ixgbe: prefetch cacheline after pointer becomes valid

2015-09-25 Thread Bruce Richardson
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

2015-09-25 Thread Mcnamara, John
> -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

2015-09-25 Thread Zoltan Kiss
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

2015-09-24 Thread Zoltan Kiss
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);