[dpdk-stable] patch 'net/bnx2x: fix ramrod timeout' has been queued to LTS release 17.11.7

Yongseok Koh yskoh at mellanox.com
Tue Jul 23 03:00:46 CEST 2019


Hi,

FYI, your patch has been queued to LTS release 17.11.7

Note it hasn't been pushed to http://dpdk.org/browse/dpdk-stable yet.
It will be pushed if I get no objection by 07/27/19. So please
shout if anyone has objection.

Also note that after the patch there's a diff of the upstream commit vs the
patch applied to the branch. This will indicate if there was any rebasing
needed to apply to the stable branch. If there were code changes for rebasing
(ie: not only metadata diffs), please double check that the rebase was
correctly done.

Thanks.

Yongseok

---
>From c939dd7f21db0a6065d766b34b8e38e8afb70615 Mon Sep 17 00:00:00 2001
From: Shahed Shaikh <shshaikh at marvell.com>
Date: Thu, 11 Apr 2019 18:47:39 -0700
Subject: [PATCH] net/bnx2x: fix ramrod timeout

[ upstream commit 8bd31421c593e5f3e2ee2a4d7d3c6a74489838c6 ]

There is a race condition while processing RAMROD
completion in fast path queue through interrupt handler
and polling method.

Interrupt handler invoked from actual interrupt event
and from RAMROD processing polling flow may create a
situation where one flow will read and clear a fastpath
interrupt without actually processing the RAMROD completion.
Thus, causing a RAMROD timeout even though HW sent an
completion event.

Fix this by introducing an atomic variable which will be
set only when interrupt handler needs to process RAMROD
completion.

Fixes: 540a211084a7 ("bnx2x: driver core")

Signed-off-by: Shahed Shaikh <shshaikh at marvell.com>
---
 drivers/net/bnx2x/bnx2x.c        | 18 ++++++++++++------
 drivers/net/bnx2x/bnx2x.h        |  4 ++--
 drivers/net/bnx2x/bnx2x_ethdev.c |  2 +-
 drivers/net/bnx2x/ecore_sp.c     | 12 ++++++++++--
 4 files changed, 25 insertions(+), 11 deletions(-)

diff --git a/drivers/net/bnx2x/bnx2x.c b/drivers/net/bnx2x/bnx2x.c
index 5e53782e94..8d6a191be0 100644
--- a/drivers/net/bnx2x/bnx2x.c
+++ b/drivers/net/bnx2x/bnx2x.c
@@ -128,7 +128,7 @@ static __rte_noinline
 int bnx2x_nic_load(struct bnx2x_softc *sc);
 
 static int bnx2x_handle_sp_tq(struct bnx2x_softc *sc);
-static void bnx2x_handle_fp_tq(struct bnx2x_fastpath *fp, int scan_fp);
+static void bnx2x_handle_fp_tq(struct bnx2x_fastpath *fp);
 static void bnx2x_ack_sb(struct bnx2x_softc *sc, uint8_t igu_sb_id,
 			 uint8_t storm, uint16_t index, uint8_t op,
 			 uint8_t update);
@@ -1118,6 +1118,12 @@ bnx2x_sp_post(struct bnx2x_softc *sc, int command, int cid, uint32_t data_hi,
 		    atomic_load_acq_long(&sc->cq_spq_left),
 		    atomic_load_acq_long(&sc->eq_spq_left));
 
+	/* RAMROD completion is processed in bnx2x_intr_legacy()
+	 * which can run from different contexts.
+	 * Ask bnx2x_intr_intr() to process RAMROD
+	 * completion whenever it gets scheduled.
+	 */
+	rte_atomic32_set(&sc->scan_fp, 1);
 	bnx2x_sp_prod_update(sc);
 
 	return 0;
@@ -4545,7 +4551,7 @@ static int bnx2x_handle_sp_tq(struct bnx2x_softc *sc)
 	return rc;
 }
 
-static void bnx2x_handle_fp_tq(struct bnx2x_fastpath *fp, int scan_fp)
+static void bnx2x_handle_fp_tq(struct bnx2x_fastpath *fp)
 {
 	struct bnx2x_softc *sc = fp->sc;
 	uint8_t more_rx = FALSE;
@@ -4560,14 +4566,14 @@ static void bnx2x_handle_fp_tq(struct bnx2x_fastpath *fp, int scan_fp)
 	/* update the fastpath index */
 	bnx2x_update_fp_sb_idx(fp);
 
-	if (scan_fp) {
+	if (rte_atomic32_read(&sc->scan_fp) == 1) {
 		if (bnx2x_has_rx_work(fp)) {
 			more_rx = bnx2x_rxeof(sc, fp);
 		}
 
 		if (more_rx) {
 			/* still more work to do */
-			bnx2x_handle_fp_tq(fp, scan_fp);
+			bnx2x_handle_fp_tq(fp);
 			return;
 		}
 	}
@@ -4583,7 +4589,7 @@ static void bnx2x_handle_fp_tq(struct bnx2x_fastpath *fp, int scan_fp)
  * then calls a separate routine to handle the various
  * interrupt causes: link, RX, and TX.
  */
-int bnx2x_intr_legacy(struct bnx2x_softc *sc, int scan_fp)
+int bnx2x_intr_legacy(struct bnx2x_softc *sc)
 {
 	struct bnx2x_fastpath *fp;
 	uint32_t status, mask;
@@ -4615,7 +4621,7 @@ int bnx2x_intr_legacy(struct bnx2x_softc *sc, int scan_fp)
 		/* acknowledge and disable further fastpath interrupts */
 			bnx2x_ack_sb(sc, fp->igu_sb_id, USTORM_ID,
 				     0, IGU_INT_DISABLE, 0);
-			bnx2x_handle_fp_tq(fp, scan_fp);
+			bnx2x_handle_fp_tq(fp);
 			status &= ~mask;
 		}
 	}
diff --git a/drivers/net/bnx2x/bnx2x.h b/drivers/net/bnx2x/bnx2x.h
index 88f788a35f..d050b2a5d6 100644
--- a/drivers/net/bnx2x/bnx2x.h
+++ b/drivers/net/bnx2x/bnx2x.h
@@ -1089,7 +1089,7 @@ struct bnx2x_softc {
 #define PERIODIC_STOP 0
 #define PERIODIC_GO   1
 	volatile unsigned long periodic_flags;
-
+	rte_atomic32_t	scan_fp;
 	struct bnx2x_fastpath fp[MAX_RSS_CHAINS];
 	struct bnx2x_sp_objs  sp_objs[MAX_RSS_CHAINS];
 
@@ -1938,7 +1938,7 @@ int bnx2x_tx_encap(struct bnx2x_tx_queue *txq, struct rte_mbuf *m0);
 uint8_t bnx2x_txeof(struct bnx2x_softc *sc, struct bnx2x_fastpath *fp);
 void bnx2x_print_adapter_info(struct bnx2x_softc *sc);
 void bnx2x_print_device_info(struct bnx2x_softc *sc);
-int bnx2x_intr_legacy(struct bnx2x_softc *sc, int scan_fp);
+int bnx2x_intr_legacy(struct bnx2x_softc *sc);
 void bnx2x_link_status_update(struct bnx2x_softc *sc);
 int bnx2x_complete_sp(struct bnx2x_softc *sc);
 int bnx2x_set_storm_rx_mode(struct bnx2x_softc *sc);
diff --git a/drivers/net/bnx2x/bnx2x_ethdev.c b/drivers/net/bnx2x/bnx2x_ethdev.c
index 23f643af0a..70f5d797db 100644
--- a/drivers/net/bnx2x/bnx2x_ethdev.c
+++ b/drivers/net/bnx2x/bnx2x_ethdev.c
@@ -169,7 +169,7 @@ bnx2x_interrupt_action(struct rte_eth_dev *dev)
 	struct bnx2x_softc *sc = dev->data->dev_private;
 	uint32_t link_status;
 
-	bnx2x_intr_legacy(sc, 0);
+	bnx2x_intr_legacy(sc);
 
 	if (sc->periodic_flags & PERIODIC_GO)
 		bnx2x_periodic_callout(sc);
diff --git a/drivers/net/bnx2x/ecore_sp.c b/drivers/net/bnx2x/ecore_sp.c
index f000a781b0..d8f167a970 100644
--- a/drivers/net/bnx2x/ecore_sp.c
+++ b/drivers/net/bnx2x/ecore_sp.c
@@ -293,25 +293,33 @@ static int ecore_state_wait(struct bnx2x_softc *sc, int state,
 		cnt *= 20;
 
 	ECORE_MSG(sc, "waiting for state to become %d", state);
+	/* being over protective to remind bnx2x_intr_legacy() to
+	 * process RAMROD
+	 */
+	rte_atomic32_set(&sc->scan_fp, 1);
 
 	ECORE_MIGHT_SLEEP();
 	while (cnt--) {
-		bnx2x_intr_legacy(sc, 1);
+		bnx2x_intr_legacy(sc);
 		if (!ECORE_TEST_BIT(state, pstate)) {
 #ifdef ECORE_STOP_ON_ERROR
 			ECORE_MSG(sc, "exit  (cnt %d)", 5000 - cnt);
 #endif
+			rte_atomic32_set(&sc->scan_fp, 0);
 			return ECORE_SUCCESS;
 		}
 
 		ECORE_WAIT(sc, delay_us);
 
-		if (sc->panic)
+		if (sc->panic) {
+			rte_atomic32_set(&sc->scan_fp, 0);
 			return ECORE_IO;
+		}
 	}
 
 	/* timeout! */
 	PMD_DRV_LOG(ERR, sc, "timeout waiting for state %d", state);
+	rte_atomic32_set(&sc->scan_fp, 0);
 #ifdef ECORE_STOP_ON_ERROR
 	ecore_panic();
 #endif
-- 
2.21.0

---
  Diff of the applied patch vs upstream commit (please double-check if non-empty:
---
--- -	2019-07-22 17:55:10.722505093 -0700
+++ 0079-net-bnx2x-fix-ramrod-timeout.patch	2019-07-22 17:55:06.337475000 -0700
@@ -1,8 +1,10 @@
-From 8bd31421c593e5f3e2ee2a4d7d3c6a74489838c6 Mon Sep 17 00:00:00 2001
+From c939dd7f21db0a6065d766b34b8e38e8afb70615 Mon Sep 17 00:00:00 2001
 From: Shahed Shaikh <shshaikh at marvell.com>
 Date: Thu, 11 Apr 2019 18:47:39 -0700
 Subject: [PATCH] net/bnx2x: fix ramrod timeout
 
+[ upstream commit 8bd31421c593e5f3e2ee2a4d7d3c6a74489838c6 ]
+
 There is a race condition while processing RAMROD
 completion in fast path queue through interrupt handler
 and polling method.
@@ -19,7 +21,6 @@
 completion.
 
 Fixes: 540a211084a7 ("bnx2x: driver core")
-Cc: stable at dpdk.org
 
 Signed-off-by: Shahed Shaikh <shshaikh at marvell.com>
 ---
@@ -30,10 +31,10 @@
  4 files changed, 25 insertions(+), 11 deletions(-)
 
 diff --git a/drivers/net/bnx2x/bnx2x.c b/drivers/net/bnx2x/bnx2x.c
-index 298bc414a7..f32db6d12a 100644
+index 5e53782e94..8d6a191be0 100644
 --- a/drivers/net/bnx2x/bnx2x.c
 +++ b/drivers/net/bnx2x/bnx2x.c
-@@ -124,7 +124,7 @@ static __rte_noinline
+@@ -128,7 +128,7 @@ static __rte_noinline
  int bnx2x_nic_load(struct bnx2x_softc *sc);
  
  static int bnx2x_handle_sp_tq(struct bnx2x_softc *sc);
@@ -42,7 +43,7 @@
  static void bnx2x_ack_sb(struct bnx2x_softc *sc, uint8_t igu_sb_id,
  			 uint8_t storm, uint16_t index, uint8_t op,
  			 uint8_t update);
-@@ -1114,6 +1114,12 @@ bnx2x_sp_post(struct bnx2x_softc *sc, int command, int cid, uint32_t data_hi,
+@@ -1118,6 +1118,12 @@ bnx2x_sp_post(struct bnx2x_softc *sc, int command, int cid, uint32_t data_hi,
  		    atomic_load_acq_long(&sc->cq_spq_left),
  		    atomic_load_acq_long(&sc->eq_spq_left));
  
@@ -55,7 +56,7 @@
  	bnx2x_sp_prod_update(sc);
  
  	return 0;
-@@ -4539,7 +4545,7 @@ static int bnx2x_handle_sp_tq(struct bnx2x_softc *sc)
+@@ -4545,7 +4551,7 @@ static int bnx2x_handle_sp_tq(struct bnx2x_softc *sc)
  	return rc;
  }
  
@@ -64,7 +65,7 @@
  {
  	struct bnx2x_softc *sc = fp->sc;
  	uint8_t more_rx = FALSE;
-@@ -4554,14 +4560,14 @@ static void bnx2x_handle_fp_tq(struct bnx2x_fastpath *fp, int scan_fp)
+@@ -4560,14 +4566,14 @@ static void bnx2x_handle_fp_tq(struct bnx2x_fastpath *fp, int scan_fp)
  	/* update the fastpath index */
  	bnx2x_update_fp_sb_idx(fp);
  
@@ -81,7 +82,7 @@
  			return;
  		}
  	}
-@@ -4577,7 +4583,7 @@ static void bnx2x_handle_fp_tq(struct bnx2x_fastpath *fp, int scan_fp)
+@@ -4583,7 +4589,7 @@ static void bnx2x_handle_fp_tq(struct bnx2x_fastpath *fp, int scan_fp)
   * then calls a separate routine to handle the various
   * interrupt causes: link, RX, and TX.
   */
@@ -90,7 +91,7 @@
  {
  	struct bnx2x_fastpath *fp;
  	uint32_t status, mask;
-@@ -4609,7 +4615,7 @@ int bnx2x_intr_legacy(struct bnx2x_softc *sc, int scan_fp)
+@@ -4615,7 +4621,7 @@ int bnx2x_intr_legacy(struct bnx2x_softc *sc, int scan_fp)
  		/* acknowledge and disable further fastpath interrupts */
  			bnx2x_ack_sb(sc, fp->igu_sb_id, USTORM_ID,
  				     0, IGU_INT_DISABLE, 0);
@@ -100,10 +101,10 @@
  		}
  	}
 diff --git a/drivers/net/bnx2x/bnx2x.h b/drivers/net/bnx2x/bnx2x.h
-index 9e82a89311..bb80310014 100644
+index 88f788a35f..d050b2a5d6 100644
 --- a/drivers/net/bnx2x/bnx2x.h
 +++ b/drivers/net/bnx2x/bnx2x.h
-@@ -1090,7 +1090,7 @@ struct bnx2x_softc {
+@@ -1089,7 +1089,7 @@ struct bnx2x_softc {
  #define PERIODIC_STOP 0
  #define PERIODIC_GO   1
  	volatile unsigned long periodic_flags;
@@ -112,7 +113,7 @@
  	struct bnx2x_fastpath fp[MAX_RSS_CHAINS];
  	struct bnx2x_sp_objs  sp_objs[MAX_RSS_CHAINS];
  
-@@ -1939,7 +1939,7 @@ int bnx2x_tx_encap(struct bnx2x_tx_queue *txq, struct rte_mbuf *m0);
+@@ -1938,7 +1938,7 @@ int bnx2x_tx_encap(struct bnx2x_tx_queue *txq, struct rte_mbuf *m0);
  uint8_t bnx2x_txeof(struct bnx2x_softc *sc, struct bnx2x_fastpath *fp);
  void bnx2x_print_adapter_info(struct bnx2x_softc *sc);
  void bnx2x_print_device_info(struct bnx2x_softc *sc);
@@ -122,10 +123,10 @@
  int bnx2x_complete_sp(struct bnx2x_softc *sc);
  int bnx2x_set_storm_rx_mode(struct bnx2x_softc *sc);
 diff --git a/drivers/net/bnx2x/bnx2x_ethdev.c b/drivers/net/bnx2x/bnx2x_ethdev.c
-index 5b4c5cf84b..bcb899a57c 100644
+index 23f643af0a..70f5d797db 100644
 --- a/drivers/net/bnx2x/bnx2x_ethdev.c
 +++ b/drivers/net/bnx2x/bnx2x_ethdev.c
-@@ -113,7 +113,7 @@ bnx2x_interrupt_action(struct rte_eth_dev *dev)
+@@ -169,7 +169,7 @@ bnx2x_interrupt_action(struct rte_eth_dev *dev)
  	struct bnx2x_softc *sc = dev->data->dev_private;
  	uint32_t link_status;
  
@@ -135,10 +136,10 @@
  	if (sc->periodic_flags & PERIODIC_GO)
  		bnx2x_periodic_callout(sc);
 diff --git a/drivers/net/bnx2x/ecore_sp.c b/drivers/net/bnx2x/ecore_sp.c
-index 6d2bb815c4..43194095bc 100644
+index f000a781b0..d8f167a970 100644
 --- a/drivers/net/bnx2x/ecore_sp.c
 +++ b/drivers/net/bnx2x/ecore_sp.c
-@@ -291,25 +291,33 @@ static int ecore_state_wait(struct bnx2x_softc *sc, int state,
+@@ -293,25 +293,33 @@ static int ecore_state_wait(struct bnx2x_softc *sc, int state,
  		cnt *= 20;
  
  	ECORE_MSG(sc, "waiting for state to become %d", state);


More information about the stable mailing list