From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mga09.intel.com (mga09.intel.com [134.134.136.24]) by dpdk.org (Postfix) with ESMTP id 907F13005 for ; Wed, 9 Nov 2016 05:53:26 +0100 (CET) Received: from fmsmga001.fm.intel.com ([10.253.24.23]) by orsmga102.jf.intel.com with ESMTP; 08 Nov 2016 20:53:25 -0800 X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.31,612,1473145200"; d="scan'208";a="1065957265" Received: from yliu-dev.sh.intel.com (HELO yliu-dev) ([10.239.67.162]) by fmsmga001.fm.intel.com with ESMTP; 08 Nov 2016 20:53:24 -0800 Date: Wed, 9 Nov 2016 12:54:13 +0800 From: Yuanhan Liu To: Qi Zhang Cc: stable@dpdk.org Message-ID: <20161109045413.GQ10323@yliu-dev.sh.intel.com> References: <1478454368-61614-1-git-send-email-qi.z.zhang@intel.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1478454368-61614-1-git-send-email-qi.z.zhang@intel.com> User-Agent: Mutt/1.5.23 (2014-03-12) Subject: Re: [dpdk-stable] [PATCH] net/i40e: fix out of order Rx read X-BeenThere: stable@dpdk.org X-Mailman-Version: 2.1.15 Precedence: list List-Id: patches for stable branches List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Wed, 09 Nov 2016 04:53:27 -0000 Applied to dpdk-stable branch 16.07. Thanks. --yliu On Mon, Nov 07, 2016 at 01:46:08AM +0800, Qi Zhang wrote: > In vPMD, when we load Rx desc with _mm_loadu_si128, the volatile > modifier will be cast away, allowing the compiler to reorder the > load instructions. > > The Rx recv function's correctness is relying on these load > instructions following a strict sequence, reading the descriptors > in reverse order, so we add compiler barrier to prevent compiler > reorder. > > Fixes: 9ed94e5bb04e ("i40e: add vector Rx") > > Signed-off-by: Qi Zhang > --- > drivers/net/i40e/i40e_rxtx_vec.c | 4 +++- > 1 file changed, 3 insertions(+), 1 deletion(-) > > diff --git a/drivers/net/i40e/i40e_rxtx_vec.c b/drivers/net/i40e/i40e_rxtx_vec.c > index 82571ee..a9649d3 100644 > --- a/drivers/net/i40e/i40e_rxtx_vec.c > +++ b/drivers/net/i40e/i40e_rxtx_vec.c > @@ -282,7 +282,7 @@ _recv_raw_pkts_vec(struct i40e_rx_queue *rxq, struct rte_mbuf **rx_pkts, > /* Read desc statuses backwards to avoid race condition */ > /* A.1 load 4 pkts desc */ > descs[3] = _mm_loadu_si128((__m128i *)(rxdp + 3)); > - > + rte_compiler_barrier(); > /* B.2 copy 2 mbuf point into rx_pkts */ > _mm_storeu_si128((__m128i *)&rx_pkts[pos], mbp1); > > @@ -290,8 +290,10 @@ _recv_raw_pkts_vec(struct i40e_rx_queue *rxq, struct rte_mbuf **rx_pkts, > mbp2 = _mm_loadu_si128((__m128i *)&sw_ring[pos+2]); > > descs[2] = _mm_loadu_si128((__m128i *)(rxdp + 2)); > + rte_compiler_barrier(); > /* B.1 load 2 mbuf point */ > descs[1] = _mm_loadu_si128((__m128i *)(rxdp + 1)); > + rte_compiler_barrier(); > descs[0] = _mm_loadu_si128((__m128i *)(rxdp)); > > /* B.2 copy 2 mbuf point into rx_pkts */ > -- > 2.7.4