[dpdk-dev] net/nfp: fix barrier location

Message ID 1519299039-2475-1-git-send-email-alejandro.lucero@netronome.com (mailing list archive)
State Accepted, archived
Delegated to: Ferruh Yigit
Headers

Checks

Context Check Description
ci/checkpatch success coding style OK
ci/Intel-compilation success Compilation OK

Commit Message

Alejandro Lucero Feb. 22, 2018, 11:30 a.m. UTC
  The barrier needs to be after reading the DD bit. It has not been
a problem because the potential reads which can not happen before
reading the DD bit seem to be far enough, so the compiler is not
rescheduling them. However, a refactoring could make this problem
to arise.

Fixes: b812daadad0d ("nfp: add Rx and Tx")

Signed-off-by: Alejandro Lucero <alejandro.lucero@netronome.com>
---
 drivers/net/nfp/nfp_net.c | 8 ++++----
 1 file changed, 4 insertions(+), 4 deletions(-)
  

Comments

Ferruh Yigit March 7, 2018, 11:51 a.m. UTC | #1
On 2/22/2018 11:30 AM, Alejandro Lucero wrote:
> The barrier needs to be after reading the DD bit. It has not been
> a problem because the potential reads which can not happen before
> reading the DD bit seem to be far enough, so the compiler is not
> rescheduling them. However, a refactoring could make this problem
> to arise.
> 
> Fixes: b812daadad0d ("nfp: add Rx and Tx")
Cc: stable@dpdk.org

> 
> Signed-off-by: Alejandro Lucero <alejandro.lucero@netronome.com>

Applied to dpdk-next-net/master, thanks.


Unrelated to this patch but nfp driver is still missing:
1- SPDX licensing tags
2- new offloading API.

Can you please plan for them for this release? Specially second one is important
because missing it may break the driver for this release.

Thanks,
ferruh
  

Patch

diff --git a/drivers/net/nfp/nfp_net.c b/drivers/net/nfp/nfp_net.c
index 5180a31..fc501d6 100644
--- a/drivers/net/nfp/nfp_net.c
+++ b/drivers/net/nfp/nfp_net.c
@@ -2019,16 +2019,16 @@  enum nfp_qcp_ptr {
 			break;
 		}
 
+		rxds = &rxq->rxds[rxq->rd_p];
+		if ((rxds->rxd.meta_len_dd & PCIE_DESC_RX_DD) == 0)
+			break;
+
 		/*
 		 * Memory barrier to ensure that we won't do other
 		 * reads before the DD bit.
 		 */
 		rte_rmb();
 
-		rxds = &rxq->rxds[rxq->rd_p];
-		if ((rxds->rxd.meta_len_dd & PCIE_DESC_RX_DD) == 0)
-			break;
-
 		/*
 		 * We got a packet. Let's alloc a new mbuff for refilling the
 		 * free descriptor ring as soon as possible