DPDK patches and discussions
 help / color / mirror / Atom feed
* [dpdk-dev] [PATCH 1/6] net/bnx2x: fix eth dev MTU
@ 2019-04-12  1:47 Rasesh Mody
  2019-04-12  1:47 ` Rasesh Mody
                   ` (6 more replies)
  0 siblings, 7 replies; 14+ messages in thread
From: Rasesh Mody @ 2019-04-12  1:47 UTC (permalink / raw)
  To: dev; +Cc: Rasesh Mody, ferruh.yigit, GR-Everest-DPDK-Dev, stable

Fix to update eth dev MTU for jumbo frames

Fixes: 540a211084a7 ("bnx2x: driver core")
Cc: stable@dpdk.org

Signed-off-by: Rasesh Mody <rmody@marvell.com>
---
 drivers/net/bnx2x/bnx2x_ethdev.c |    4 +++-
 1 file changed, 3 insertions(+), 1 deletion(-)

diff --git a/drivers/net/bnx2x/bnx2x_ethdev.c b/drivers/net/bnx2x/bnx2x_ethdev.c
index 1f2eb92..5b4c5cf 100644
--- a/drivers/net/bnx2x/bnx2x_ethdev.c
+++ b/drivers/net/bnx2x/bnx2x_ethdev.c
@@ -181,8 +181,10 @@ void bnx2x_periodic_stop(void *param)
 
 	PMD_INIT_FUNC_TRACE(sc);
 
-	if (rxmode->offloads & DEV_RX_OFFLOAD_JUMBO_FRAME)
+	if (rxmode->offloads & DEV_RX_OFFLOAD_JUMBO_FRAME) {
 		sc->mtu = dev->data->dev_conf.rxmode.max_rx_pkt_len;
+		dev->data->mtu = sc->mtu;
+	}
 
 	if (dev->data->nb_tx_queues > dev->data->nb_rx_queues) {
 		PMD_DRV_LOG(ERR, sc, "The number of TX queues is greater than number of RX queues");
-- 
1.7.10.3

^ permalink raw reply	[flat|nested] 14+ messages in thread

* [dpdk-dev] [PATCH 1/6] net/bnx2x: fix eth dev MTU
  2019-04-12  1:47 [dpdk-dev] [PATCH 1/6] net/bnx2x: fix eth dev MTU Rasesh Mody
@ 2019-04-12  1:47 ` Rasesh Mody
  2019-04-12  1:47 ` [dpdk-dev] [PATCH 2/6] net/bnx2x: fix memory leak Rasesh Mody
                   ` (5 subsequent siblings)
  6 siblings, 0 replies; 14+ messages in thread
From: Rasesh Mody @ 2019-04-12  1:47 UTC (permalink / raw)
  To: dev; +Cc: Rasesh Mody, ferruh.yigit, GR-Everest-DPDK-Dev, stable

Fix to update eth dev MTU for jumbo frames

Fixes: 540a211084a7 ("bnx2x: driver core")
Cc: stable@dpdk.org

Signed-off-by: Rasesh Mody <rmody@marvell.com>
---
 drivers/net/bnx2x/bnx2x_ethdev.c |    4 +++-
 1 file changed, 3 insertions(+), 1 deletion(-)

diff --git a/drivers/net/bnx2x/bnx2x_ethdev.c b/drivers/net/bnx2x/bnx2x_ethdev.c
index 1f2eb92..5b4c5cf 100644
--- a/drivers/net/bnx2x/bnx2x_ethdev.c
+++ b/drivers/net/bnx2x/bnx2x_ethdev.c
@@ -181,8 +181,10 @@ void bnx2x_periodic_stop(void *param)
 
 	PMD_INIT_FUNC_TRACE(sc);
 
-	if (rxmode->offloads & DEV_RX_OFFLOAD_JUMBO_FRAME)
+	if (rxmode->offloads & DEV_RX_OFFLOAD_JUMBO_FRAME) {
 		sc->mtu = dev->data->dev_conf.rxmode.max_rx_pkt_len;
+		dev->data->mtu = sc->mtu;
+	}
 
 	if (dev->data->nb_tx_queues > dev->data->nb_rx_queues) {
 		PMD_DRV_LOG(ERR, sc, "The number of TX queues is greater than number of RX queues");
-- 
1.7.10.3


^ permalink raw reply	[flat|nested] 14+ messages in thread

* [dpdk-dev] [PATCH 2/6] net/bnx2x: fix memory leak
  2019-04-12  1:47 [dpdk-dev] [PATCH 1/6] net/bnx2x: fix eth dev MTU Rasesh Mody
  2019-04-12  1:47 ` Rasesh Mody
@ 2019-04-12  1:47 ` Rasesh Mody
  2019-04-12  1:47   ` Rasesh Mody
  2019-04-12  1:47 ` [dpdk-dev] [PATCH 3/6] net/bnx2x: fix ramrod timeout Rasesh Mody
                   ` (4 subsequent siblings)
  6 siblings, 1 reply; 14+ messages in thread
From: Rasesh Mody @ 2019-04-12  1:47 UTC (permalink / raw)
  To: dev; +Cc: Shahed Shaikh, ferruh.yigit, GR-Everest-DPDK-Dev, stable

From: Shahed Shaikh <shshaikh@marvell.com>

We allocate DMA memory but never free after using it.
Add function to free DMA memory.

Fixes: b5bf7719221d ("bnx2x: driver support routines")
Cc: stable@dpdk.org

Signed-off-by: Shahed Shaikh <shshaikh@marvell.com>
---
 drivers/net/bnx2x/bnx2x.c    |   15 +++++++++++++++
 drivers/net/bnx2x/bnx2x.h    |    3 ++-
 drivers/net/bnx2x/ecore_sp.h |   17 +++++++++--------
 3 files changed, 26 insertions(+), 9 deletions(-)

diff --git a/drivers/net/bnx2x/bnx2x.c b/drivers/net/bnx2x/bnx2x.c
index ab092e2..298bc41 100644
--- a/drivers/net/bnx2x/bnx2x.c
+++ b/drivers/net/bnx2x/bnx2x.c
@@ -185,6 +185,7 @@ int bnx2x_cmpxchg(volatile int *addr, int old, int new)
 	}
 	dma->paddr = (uint64_t) z->iova;
 	dma->vaddr = z->addr;
+	dma->mzone = (const void *)z;
 
 	PMD_DRV_LOG(DEBUG, sc,
 		    "%s: virt=%p phys=%" PRIx64, msg, dma->vaddr, dma->paddr);
@@ -192,6 +193,19 @@ int bnx2x_cmpxchg(volatile int *addr, int old, int new)
 	return 0;
 }
 
+void bnx2x_dma_free(struct bnx2x_dma *dma)
+{
+	if (dma->mzone == NULL)
+		return;
+
+	rte_memzone_free((const struct rte_memzone *)dma->mzone);
+	dma->sc = NULL;
+	dma->paddr = 0;
+	dma->vaddr = NULL;
+	dma->nseg = 0;
+	dma->mzone = NULL;
+}
+
 static int bnx2x_acquire_hw_lock(struct bnx2x_softc *sc, uint32_t resource)
 {
 	uint32_t lock_status;
@@ -2436,6 +2450,7 @@ static int bnx2x_alloc_mem(struct bnx2x_softc *sc)
 
 static void bnx2x_free_fw_stats_mem(struct bnx2x_softc *sc)
 {
+	bnx2x_dma_free(&sc->fw_stats_dma);
 	sc->fw_stats_num = 0;
 
 	sc->fw_stats_req_size = 0;
diff --git a/drivers/net/bnx2x/bnx2x.h b/drivers/net/bnx2x/bnx2x.h
index 32a1229..9e82a89 100644
--- a/drivers/net/bnx2x/bnx2x.h
+++ b/drivers/net/bnx2x/bnx2x.h
@@ -319,6 +319,7 @@ struct bnx2x_dma {
 	rte_iova_t              paddr;
 	void                    *vaddr;
 	int                     nseg;
+	const void		*mzone;
 	char                    msg[RTE_MEMZONE_NAMESIZE - 6];
 };
 
@@ -1753,7 +1754,7 @@ struct bnx2x_func_init_params {
 
 int bnx2x_dma_alloc(struct bnx2x_softc *sc, size_t size,
 		struct bnx2x_dma *dma, const char *msg, uint32_t align);
-
+void bnx2x_dma_free(struct bnx2x_dma *dma);
 uint32_t bnx2x_dmae_opcode_add_comp(uint32_t opcode, uint8_t comp_type);
 uint32_t bnx2x_dmae_opcode_clr_src_reset(uint32_t opcode);
 uint32_t bnx2x_dmae_opcode(struct bnx2x_softc *sc, uint8_t src_type,
diff --git a/drivers/net/bnx2x/ecore_sp.h b/drivers/net/bnx2x/ecore_sp.h
index f295bf5..7126097 100644
--- a/drivers/net/bnx2x/ecore_sp.h
+++ b/drivers/net/bnx2x/ecore_sp.h
@@ -151,14 +151,15 @@
 		}							\
 	} while (0)
 
-#define ECORE_ILT_FREE(x, y, size)                   \
-    do {                                             \
-	if (x) {                                     \
-	    rte_free(x);                             \
-	    x = NULL;                                \
-	    y = 0;                                   \
-	}                                            \
-    } while (0)
+#define ECORE_ILT_FREE(x, y, size)					\
+	do {								\
+		if (x) {						\
+			bnx2x_dma_free((struct bnx2x_dma *)x);		\
+			rte_free(x);					\
+			x = NULL;					\
+			y = 0;						\
+		}							\
+	} while (0)
 
 #define ECORE_IS_VALID_ETHER_ADDR(_mac) TRUE
 
-- 
1.7.10.3

^ permalink raw reply	[flat|nested] 14+ messages in thread

* [dpdk-dev] [PATCH 2/6] net/bnx2x: fix memory leak
  2019-04-12  1:47 ` [dpdk-dev] [PATCH 2/6] net/bnx2x: fix memory leak Rasesh Mody
@ 2019-04-12  1:47   ` Rasesh Mody
  0 siblings, 0 replies; 14+ messages in thread
From: Rasesh Mody @ 2019-04-12  1:47 UTC (permalink / raw)
  To: dev; +Cc: Shahed Shaikh, ferruh.yigit, GR-Everest-DPDK-Dev, stable

From: Shahed Shaikh <shshaikh@marvell.com>

We allocate DMA memory but never free after using it.
Add function to free DMA memory.

Fixes: b5bf7719221d ("bnx2x: driver support routines")
Cc: stable@dpdk.org

Signed-off-by: Shahed Shaikh <shshaikh@marvell.com>
---
 drivers/net/bnx2x/bnx2x.c    |   15 +++++++++++++++
 drivers/net/bnx2x/bnx2x.h    |    3 ++-
 drivers/net/bnx2x/ecore_sp.h |   17 +++++++++--------
 3 files changed, 26 insertions(+), 9 deletions(-)

diff --git a/drivers/net/bnx2x/bnx2x.c b/drivers/net/bnx2x/bnx2x.c
index ab092e2..298bc41 100644
--- a/drivers/net/bnx2x/bnx2x.c
+++ b/drivers/net/bnx2x/bnx2x.c
@@ -185,6 +185,7 @@ int bnx2x_cmpxchg(volatile int *addr, int old, int new)
 	}
 	dma->paddr = (uint64_t) z->iova;
 	dma->vaddr = z->addr;
+	dma->mzone = (const void *)z;
 
 	PMD_DRV_LOG(DEBUG, sc,
 		    "%s: virt=%p phys=%" PRIx64, msg, dma->vaddr, dma->paddr);
@@ -192,6 +193,19 @@ int bnx2x_cmpxchg(volatile int *addr, int old, int new)
 	return 0;
 }
 
+void bnx2x_dma_free(struct bnx2x_dma *dma)
+{
+	if (dma->mzone == NULL)
+		return;
+
+	rte_memzone_free((const struct rte_memzone *)dma->mzone);
+	dma->sc = NULL;
+	dma->paddr = 0;
+	dma->vaddr = NULL;
+	dma->nseg = 0;
+	dma->mzone = NULL;
+}
+
 static int bnx2x_acquire_hw_lock(struct bnx2x_softc *sc, uint32_t resource)
 {
 	uint32_t lock_status;
@@ -2436,6 +2450,7 @@ static int bnx2x_alloc_mem(struct bnx2x_softc *sc)
 
 static void bnx2x_free_fw_stats_mem(struct bnx2x_softc *sc)
 {
+	bnx2x_dma_free(&sc->fw_stats_dma);
 	sc->fw_stats_num = 0;
 
 	sc->fw_stats_req_size = 0;
diff --git a/drivers/net/bnx2x/bnx2x.h b/drivers/net/bnx2x/bnx2x.h
index 32a1229..9e82a89 100644
--- a/drivers/net/bnx2x/bnx2x.h
+++ b/drivers/net/bnx2x/bnx2x.h
@@ -319,6 +319,7 @@ struct bnx2x_dma {
 	rte_iova_t              paddr;
 	void                    *vaddr;
 	int                     nseg;
+	const void		*mzone;
 	char                    msg[RTE_MEMZONE_NAMESIZE - 6];
 };
 
@@ -1753,7 +1754,7 @@ struct bnx2x_func_init_params {
 
 int bnx2x_dma_alloc(struct bnx2x_softc *sc, size_t size,
 		struct bnx2x_dma *dma, const char *msg, uint32_t align);
-
+void bnx2x_dma_free(struct bnx2x_dma *dma);
 uint32_t bnx2x_dmae_opcode_add_comp(uint32_t opcode, uint8_t comp_type);
 uint32_t bnx2x_dmae_opcode_clr_src_reset(uint32_t opcode);
 uint32_t bnx2x_dmae_opcode(struct bnx2x_softc *sc, uint8_t src_type,
diff --git a/drivers/net/bnx2x/ecore_sp.h b/drivers/net/bnx2x/ecore_sp.h
index f295bf5..7126097 100644
--- a/drivers/net/bnx2x/ecore_sp.h
+++ b/drivers/net/bnx2x/ecore_sp.h
@@ -151,14 +151,15 @@
 		}							\
 	} while (0)
 
-#define ECORE_ILT_FREE(x, y, size)                   \
-    do {                                             \
-	if (x) {                                     \
-	    rte_free(x);                             \
-	    x = NULL;                                \
-	    y = 0;                                   \
-	}                                            \
-    } while (0)
+#define ECORE_ILT_FREE(x, y, size)					\
+	do {								\
+		if (x) {						\
+			bnx2x_dma_free((struct bnx2x_dma *)x);		\
+			rte_free(x);					\
+			x = NULL;					\
+			y = 0;						\
+		}							\
+	} while (0)
 
 #define ECORE_IS_VALID_ETHER_ADDR(_mac) TRUE
 
-- 
1.7.10.3


^ permalink raw reply	[flat|nested] 14+ messages in thread

* [dpdk-dev] [PATCH 3/6] net/bnx2x: fix ramrod timeout
  2019-04-12  1:47 [dpdk-dev] [PATCH 1/6] net/bnx2x: fix eth dev MTU Rasesh Mody
  2019-04-12  1:47 ` Rasesh Mody
  2019-04-12  1:47 ` [dpdk-dev] [PATCH 2/6] net/bnx2x: fix memory leak Rasesh Mody
@ 2019-04-12  1:47 ` Rasesh Mody
  2019-04-12  1:47   ` Rasesh Mody
  2019-04-12  1:47 ` [dpdk-dev] [PATCH 4/6] net/bnx2x: fix DMAE timeout Rasesh Mody
                   ` (3 subsequent siblings)
  6 siblings, 1 reply; 14+ messages in thread
From: Rasesh Mody @ 2019-04-12  1:47 UTC (permalink / raw)
  To: dev; +Cc: Shahed Shaikh, ferruh.yigit, GR-Everest-DPDK-Dev, stable

From: Shahed Shaikh <shshaikh@marvell.com>

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")
Cc: stable@dpdk.org

Signed-off-by: Shahed Shaikh <shshaikh@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 298bc41..f32db6d 100644
--- a/drivers/net/bnx2x/bnx2x.c
+++ b/drivers/net/bnx2x/bnx2x.c
@@ -124,7 +124,7 @@ static void bnx2x_update_rx_prod(struct bnx2x_softc *sc,
 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);
@@ -1114,6 +1114,12 @@ static int bnx2x_is_contextless_ramrod(int cmd, int cmd_type)
 		    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;
@@ -4539,7 +4545,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;
@@ -4554,14 +4560,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;
 		}
 	}
@@ -4577,7 +4583,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;
@@ -4609,7 +4615,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 9e82a89..bb80310 100644
--- a/drivers/net/bnx2x/bnx2x.h
+++ b/drivers/net/bnx2x/bnx2x.h
@@ -1090,7 +1090,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];
 
@@ -1939,7 +1939,7 @@ void ecore_storm_memset_struct(struct bnx2x_softc *sc, uint32_t addr,
 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 5b4c5cf..bcb899a 100644
--- a/drivers/net/bnx2x/bnx2x_ethdev.c
+++ b/drivers/net/bnx2x/bnx2x_ethdev.c
@@ -113,7 +113,7 @@ struct rte_bnx2x_xstats_name_off {
 	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 6d2bb81..4319409 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,
 		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
-- 
1.7.10.3

^ permalink raw reply	[flat|nested] 14+ messages in thread

* [dpdk-dev] [PATCH 3/6] net/bnx2x: fix ramrod timeout
  2019-04-12  1:47 ` [dpdk-dev] [PATCH 3/6] net/bnx2x: fix ramrod timeout Rasesh Mody
@ 2019-04-12  1:47   ` Rasesh Mody
  0 siblings, 0 replies; 14+ messages in thread
From: Rasesh Mody @ 2019-04-12  1:47 UTC (permalink / raw)
  To: dev; +Cc: Shahed Shaikh, ferruh.yigit, GR-Everest-DPDK-Dev, stable

From: Shahed Shaikh <shshaikh@marvell.com>

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")
Cc: stable@dpdk.org

Signed-off-by: Shahed Shaikh <shshaikh@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 298bc41..f32db6d 100644
--- a/drivers/net/bnx2x/bnx2x.c
+++ b/drivers/net/bnx2x/bnx2x.c
@@ -124,7 +124,7 @@ static void bnx2x_update_rx_prod(struct bnx2x_softc *sc,
 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);
@@ -1114,6 +1114,12 @@ static int bnx2x_is_contextless_ramrod(int cmd, int cmd_type)
 		    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;
@@ -4539,7 +4545,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;
@@ -4554,14 +4560,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;
 		}
 	}
@@ -4577,7 +4583,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;
@@ -4609,7 +4615,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 9e82a89..bb80310 100644
--- a/drivers/net/bnx2x/bnx2x.h
+++ b/drivers/net/bnx2x/bnx2x.h
@@ -1090,7 +1090,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];
 
@@ -1939,7 +1939,7 @@ void ecore_storm_memset_struct(struct bnx2x_softc *sc, uint32_t addr,
 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 5b4c5cf..bcb899a 100644
--- a/drivers/net/bnx2x/bnx2x_ethdev.c
+++ b/drivers/net/bnx2x/bnx2x_ethdev.c
@@ -113,7 +113,7 @@ struct rte_bnx2x_xstats_name_off {
 	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 6d2bb81..4319409 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,
 		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
-- 
1.7.10.3


^ permalink raw reply	[flat|nested] 14+ messages in thread

* [dpdk-dev] [PATCH 4/6] net/bnx2x: fix DMAE timeout
  2019-04-12  1:47 [dpdk-dev] [PATCH 1/6] net/bnx2x: fix eth dev MTU Rasesh Mody
                   ` (2 preceding siblings ...)
  2019-04-12  1:47 ` [dpdk-dev] [PATCH 3/6] net/bnx2x: fix ramrod timeout Rasesh Mody
@ 2019-04-12  1:47 ` Rasesh Mody
  2019-04-12  1:47   ` Rasesh Mody
  2019-04-12  1:47 ` [dpdk-dev] [PATCH 5/6] net/bnx2x: fix race for periodic flags Rasesh Mody
                   ` (2 subsequent siblings)
  6 siblings, 1 reply; 14+ messages in thread
From: Rasesh Mody @ 2019-04-12  1:47 UTC (permalink / raw)
  To: dev; +Cc: Shahed Shaikh, ferruh.yigit, GR-Everest-DPDK-Dev, stable

From: Shahed Shaikh <shshaikh@marvell.com>

In some cases, DPKD application may send packets
while PMD is going through load or unload flow.
This causes firmware to access invalid/unallocated
memory to process transmit buffer. Which results in
error on PCI bus and chip further blocks access to host,
causing a DMAE timeout.

Fix this issue by installing dummy empty transmit and receive
handlers at the beginning of unload path (rte_eth_dev_stop())
and install actual transmit and receive handlers after successful
load of the PMD port (rte_eth_dev_start()). This way, application
won't be able to send packets while device is going through
load/unload flow.

Fixes: 540a211084a7 ("bnx2x: driver core")
Cc: stable@dpdk.org

Signed-off-by: Shahed Shaikh <shshaikh@marvell.com>
---
 drivers/net/bnx2x/bnx2x_ethdev.c |    9 ++++-----
 drivers/net/bnx2x/bnx2x_rxtx.c   |   21 ++++++++++++++++-----
 drivers/net/bnx2x/bnx2x_rxtx.h   |    3 ++-
 3 files changed, 22 insertions(+), 11 deletions(-)

diff --git a/drivers/net/bnx2x/bnx2x_ethdev.c b/drivers/net/bnx2x/bnx2x_ethdev.c
index bcb899a..f85766c 100644
--- a/drivers/net/bnx2x/bnx2x_ethdev.c
+++ b/drivers/net/bnx2x/bnx2x_ethdev.c
@@ -213,6 +213,7 @@ void bnx2x_periodic_stop(void *param)
 		return -ENXIO;
 	}
 
+	bnx2x_dev_rxtx_init_dummy(dev);
 	return 0;
 }
 
@@ -242,11 +243,7 @@ void bnx2x_periodic_stop(void *param)
 			PMD_DRV_LOG(ERR, sc, "rte_intr_enable failed");
 	}
 
-	ret = bnx2x_dev_rx_init(dev);
-	if (ret != 0) {
-		PMD_DRV_LOG(DEBUG, sc, "bnx2x_dev_rx_init returned error code");
-		return -3;
-	}
+	bnx2x_dev_rxtx_init(dev);
 
 	bnx2x_print_device_info(sc);
 
@@ -261,6 +258,8 @@ void bnx2x_periodic_stop(void *param)
 
 	PMD_INIT_FUNC_TRACE(sc);
 
+	bnx2x_dev_rxtx_init_dummy(dev);
+
 	if (IS_PF(sc)) {
 		rte_intr_disable(&sc->pci_dev->intr_handle);
 		rte_intr_callback_unregister(&sc->pci_dev->intr_handle,
diff --git a/drivers/net/bnx2x/bnx2x_rxtx.c b/drivers/net/bnx2x/bnx2x_rxtx.c
index ca28aac..e5a2b25 100644
--- a/drivers/net/bnx2x/bnx2x_rxtx.c
+++ b/drivers/net/bnx2x/bnx2x_rxtx.c
@@ -311,7 +311,6 @@
 	txq->tx_bd_tail = 0;
 	txq->tx_bd_head = 0;
 	txq->nb_tx_avail = txq->nb_tx_desc;
-	dev->tx_pkt_burst = bnx2x_xmit_pkts;
 	dev->data->tx_queues[queue_idx] = txq;
 	if (!sc->tx_queues) sc->tx_queues = dev->data->tx_queues;
 
@@ -441,14 +440,26 @@
 	return nb_rx;
 }
 
-int
-bnx2x_dev_rx_init(struct rte_eth_dev *dev)
+static uint16_t
+bnx2x_rxtx_pkts_dummy(__rte_unused void *p_rxq,
+		      __rte_unused struct rte_mbuf **rx_pkts,
+		      __rte_unused uint16_t nb_pkts)
 {
-	dev->rx_pkt_burst = bnx2x_recv_pkts;
-
 	return 0;
 }
 
+void bnx2x_dev_rxtx_init_dummy(struct rte_eth_dev *dev)
+{
+	dev->rx_pkt_burst = bnx2x_rxtx_pkts_dummy;
+	dev->tx_pkt_burst = bnx2x_rxtx_pkts_dummy;
+}
+
+void bnx2x_dev_rxtx_init(struct rte_eth_dev *dev)
+{
+	dev->rx_pkt_burst = bnx2x_recv_pkts;
+	dev->tx_pkt_burst = bnx2x_xmit_pkts;
+}
+
 void
 bnx2x_dev_clear_queues(struct rte_eth_dev *dev)
 {
diff --git a/drivers/net/bnx2x/bnx2x_rxtx.h b/drivers/net/bnx2x/bnx2x_rxtx.h
index 6ad4928..3f4692b 100644
--- a/drivers/net/bnx2x/bnx2x_rxtx.h
+++ b/drivers/net/bnx2x/bnx2x_rxtx.h
@@ -74,7 +74,8 @@ int bnx2x_dev_tx_queue_setup(struct rte_eth_dev *dev, uint16_t tx_queue_id,
 
 void bnx2x_dev_rx_queue_release(void *rxq);
 void bnx2x_dev_tx_queue_release(void *txq);
-int bnx2x_dev_rx_init(struct rte_eth_dev *dev);
+void bnx2x_dev_rxtx_init(struct rte_eth_dev *dev);
+void bnx2x_dev_rxtx_init_dummy(struct rte_eth_dev *dev);
 void bnx2x_dev_clear_queues(struct rte_eth_dev *dev);
 
 #endif /* _BNX2X_RXTX_H_ */
-- 
1.7.10.3

^ permalink raw reply	[flat|nested] 14+ messages in thread

* [dpdk-dev] [PATCH 4/6] net/bnx2x: fix DMAE timeout
  2019-04-12  1:47 ` [dpdk-dev] [PATCH 4/6] net/bnx2x: fix DMAE timeout Rasesh Mody
@ 2019-04-12  1:47   ` Rasesh Mody
  0 siblings, 0 replies; 14+ messages in thread
From: Rasesh Mody @ 2019-04-12  1:47 UTC (permalink / raw)
  To: dev; +Cc: Shahed Shaikh, ferruh.yigit, GR-Everest-DPDK-Dev, stable

From: Shahed Shaikh <shshaikh@marvell.com>

In some cases, DPKD application may send packets
while PMD is going through load or unload flow.
This causes firmware to access invalid/unallocated
memory to process transmit buffer. Which results in
error on PCI bus and chip further blocks access to host,
causing a DMAE timeout.

Fix this issue by installing dummy empty transmit and receive
handlers at the beginning of unload path (rte_eth_dev_stop())
and install actual transmit and receive handlers after successful
load of the PMD port (rte_eth_dev_start()). This way, application
won't be able to send packets while device is going through
load/unload flow.

Fixes: 540a211084a7 ("bnx2x: driver core")
Cc: stable@dpdk.org

Signed-off-by: Shahed Shaikh <shshaikh@marvell.com>
---
 drivers/net/bnx2x/bnx2x_ethdev.c |    9 ++++-----
 drivers/net/bnx2x/bnx2x_rxtx.c   |   21 ++++++++++++++++-----
 drivers/net/bnx2x/bnx2x_rxtx.h   |    3 ++-
 3 files changed, 22 insertions(+), 11 deletions(-)

diff --git a/drivers/net/bnx2x/bnx2x_ethdev.c b/drivers/net/bnx2x/bnx2x_ethdev.c
index bcb899a..f85766c 100644
--- a/drivers/net/bnx2x/bnx2x_ethdev.c
+++ b/drivers/net/bnx2x/bnx2x_ethdev.c
@@ -213,6 +213,7 @@ void bnx2x_periodic_stop(void *param)
 		return -ENXIO;
 	}
 
+	bnx2x_dev_rxtx_init_dummy(dev);
 	return 0;
 }
 
@@ -242,11 +243,7 @@ void bnx2x_periodic_stop(void *param)
 			PMD_DRV_LOG(ERR, sc, "rte_intr_enable failed");
 	}
 
-	ret = bnx2x_dev_rx_init(dev);
-	if (ret != 0) {
-		PMD_DRV_LOG(DEBUG, sc, "bnx2x_dev_rx_init returned error code");
-		return -3;
-	}
+	bnx2x_dev_rxtx_init(dev);
 
 	bnx2x_print_device_info(sc);
 
@@ -261,6 +258,8 @@ void bnx2x_periodic_stop(void *param)
 
 	PMD_INIT_FUNC_TRACE(sc);
 
+	bnx2x_dev_rxtx_init_dummy(dev);
+
 	if (IS_PF(sc)) {
 		rte_intr_disable(&sc->pci_dev->intr_handle);
 		rte_intr_callback_unregister(&sc->pci_dev->intr_handle,
diff --git a/drivers/net/bnx2x/bnx2x_rxtx.c b/drivers/net/bnx2x/bnx2x_rxtx.c
index ca28aac..e5a2b25 100644
--- a/drivers/net/bnx2x/bnx2x_rxtx.c
+++ b/drivers/net/bnx2x/bnx2x_rxtx.c
@@ -311,7 +311,6 @@
 	txq->tx_bd_tail = 0;
 	txq->tx_bd_head = 0;
 	txq->nb_tx_avail = txq->nb_tx_desc;
-	dev->tx_pkt_burst = bnx2x_xmit_pkts;
 	dev->data->tx_queues[queue_idx] = txq;
 	if (!sc->tx_queues) sc->tx_queues = dev->data->tx_queues;
 
@@ -441,14 +440,26 @@
 	return nb_rx;
 }
 
-int
-bnx2x_dev_rx_init(struct rte_eth_dev *dev)
+static uint16_t
+bnx2x_rxtx_pkts_dummy(__rte_unused void *p_rxq,
+		      __rte_unused struct rte_mbuf **rx_pkts,
+		      __rte_unused uint16_t nb_pkts)
 {
-	dev->rx_pkt_burst = bnx2x_recv_pkts;
-
 	return 0;
 }
 
+void bnx2x_dev_rxtx_init_dummy(struct rte_eth_dev *dev)
+{
+	dev->rx_pkt_burst = bnx2x_rxtx_pkts_dummy;
+	dev->tx_pkt_burst = bnx2x_rxtx_pkts_dummy;
+}
+
+void bnx2x_dev_rxtx_init(struct rte_eth_dev *dev)
+{
+	dev->rx_pkt_burst = bnx2x_recv_pkts;
+	dev->tx_pkt_burst = bnx2x_xmit_pkts;
+}
+
 void
 bnx2x_dev_clear_queues(struct rte_eth_dev *dev)
 {
diff --git a/drivers/net/bnx2x/bnx2x_rxtx.h b/drivers/net/bnx2x/bnx2x_rxtx.h
index 6ad4928..3f4692b 100644
--- a/drivers/net/bnx2x/bnx2x_rxtx.h
+++ b/drivers/net/bnx2x/bnx2x_rxtx.h
@@ -74,7 +74,8 @@ int bnx2x_dev_tx_queue_setup(struct rte_eth_dev *dev, uint16_t tx_queue_id,
 
 void bnx2x_dev_rx_queue_release(void *rxq);
 void bnx2x_dev_tx_queue_release(void *txq);
-int bnx2x_dev_rx_init(struct rte_eth_dev *dev);
+void bnx2x_dev_rxtx_init(struct rte_eth_dev *dev);
+void bnx2x_dev_rxtx_init_dummy(struct rte_eth_dev *dev);
 void bnx2x_dev_clear_queues(struct rte_eth_dev *dev);
 
 #endif /* _BNX2X_RXTX_H_ */
-- 
1.7.10.3


^ permalink raw reply	[flat|nested] 14+ messages in thread

* [dpdk-dev] [PATCH 5/6] net/bnx2x: fix race for periodic flags
  2019-04-12  1:47 [dpdk-dev] [PATCH 1/6] net/bnx2x: fix eth dev MTU Rasesh Mody
                   ` (3 preceding siblings ...)
  2019-04-12  1:47 ` [dpdk-dev] [PATCH 4/6] net/bnx2x: fix DMAE timeout Rasesh Mody
@ 2019-04-12  1:47 ` Rasesh Mody
  2019-04-12  1:47   ` Rasesh Mody
  2019-04-12  1:47 ` [dpdk-dev] [PATCH 6/6] net/bnx2x: fix optic module verification Rasesh Mody
  2019-04-15  8:01 ` [dpdk-dev] [PATCH 1/6] net/bnx2x: fix eth dev MTU Ferruh Yigit
  6 siblings, 1 reply; 14+ messages in thread
From: Rasesh Mody @ 2019-04-12  1:47 UTC (permalink / raw)
  To: dev; +Cc: Rasesh Mody, ferruh.yigit, GR-Everest-DPDK-Dev, stable

The periodic callout function and the interrupt handler both modify the
periodic flags. There is a possible race condition when an application is
going through dev_stop()/dev_start() and an interrupt handler is invoked.
We also need to ensure that periodic polling is not invoked in interrupt
context.

This patch handles such case by using separate variable to check for
interrupt context. Also, atomically load and store the periodic flag
value.

Fixes: 0f6ebeee2402 ("net/bnx2x: fix call to link handling periodic function")
Cc: stable@dpdk.org

Signed-off-by: Rasesh Mody <rmody@marvell.com>
---
 drivers/net/bnx2x/bnx2x_ethdev.c |   17 ++++++++++-------
 1 file changed, 10 insertions(+), 7 deletions(-)

diff --git a/drivers/net/bnx2x/bnx2x_ethdev.c b/drivers/net/bnx2x/bnx2x_ethdev.c
index f85766c..3063aea 100644
--- a/drivers/net/bnx2x/bnx2x_ethdev.c
+++ b/drivers/net/bnx2x/bnx2x_ethdev.c
@@ -108,14 +108,15 @@ struct rte_bnx2x_xstats_name_off {
 }
 
 static void
-bnx2x_interrupt_action(struct rte_eth_dev *dev)
+bnx2x_interrupt_action(struct rte_eth_dev *dev, int intr_cxt)
 {
 	struct bnx2x_softc *sc = dev->data->dev_private;
 	uint32_t link_status;
 
 	bnx2x_intr_legacy(sc);
 
-	if (sc->periodic_flags & PERIODIC_GO)
+	if ((atomic_load_acq_long(&sc->periodic_flags) == PERIODIC_GO) &&
+	    !intr_cxt)
 		bnx2x_periodic_callout(sc);
 	link_status = REG_RD(sc, sc->link_params.shmem_base +
 			offsetof(struct shmem_region,
@@ -132,9 +133,7 @@ struct rte_bnx2x_xstats_name_off {
 
 	PMD_DEBUG_PERIODIC_LOG(INFO, sc, "Interrupt handled");
 
-	atomic_store_rel_long(&sc->periodic_flags, PERIODIC_STOP);
-	bnx2x_interrupt_action(dev);
-	atomic_store_rel_long(&sc->periodic_flags, PERIODIC_GO);
+	bnx2x_interrupt_action(dev, 1);
 	rte_intr_enable(&sc->pci_dev->intr_handle);
 }
 
@@ -145,7 +144,7 @@ static void bnx2x_periodic_start(void *param)
 	int ret = 0;
 
 	atomic_store_rel_long(&sc->periodic_flags, PERIODIC_GO);
-	bnx2x_interrupt_action(dev);
+	bnx2x_interrupt_action(dev, 0);
 	if (IS_PF(sc)) {
 		ret = rte_eal_alarm_set(BNX2X_SP_TIMER_PERIOD,
 					bnx2x_periodic_start, (void *)dev);
@@ -165,6 +164,8 @@ void bnx2x_periodic_stop(void *param)
 	atomic_store_rel_long(&sc->periodic_flags, PERIODIC_STOP);
 
 	rte_eal_alarm_cancel(bnx2x_periodic_start, (void *)dev);
+
+	PMD_DRV_LOG(DEBUG, sc, "Periodic poll stopped");
 }
 
 /*
@@ -226,8 +227,10 @@ void bnx2x_periodic_stop(void *param)
 	PMD_INIT_FUNC_TRACE(sc);
 
 	/* start the periodic callout */
-	if (sc->periodic_flags & PERIODIC_STOP)
+	if (atomic_load_acq_long(&sc->periodic_flags) == PERIODIC_STOP) {
 		bnx2x_periodic_start(dev);
+		PMD_DRV_LOG(DEBUG, sc, "Periodic poll re-started");
+	}
 
 	ret = bnx2x_init(sc);
 	if (ret) {
-- 
1.7.10.3

^ permalink raw reply	[flat|nested] 14+ messages in thread

* [dpdk-dev] [PATCH 5/6] net/bnx2x: fix race for periodic flags
  2019-04-12  1:47 ` [dpdk-dev] [PATCH 5/6] net/bnx2x: fix race for periodic flags Rasesh Mody
@ 2019-04-12  1:47   ` Rasesh Mody
  0 siblings, 0 replies; 14+ messages in thread
From: Rasesh Mody @ 2019-04-12  1:47 UTC (permalink / raw)
  To: dev; +Cc: Rasesh Mody, ferruh.yigit, GR-Everest-DPDK-Dev, stable

The periodic callout function and the interrupt handler both modify the
periodic flags. There is a possible race condition when an application is
going through dev_stop()/dev_start() and an interrupt handler is invoked.
We also need to ensure that periodic polling is not invoked in interrupt
context.

This patch handles such case by using separate variable to check for
interrupt context. Also, atomically load and store the periodic flag
value.

Fixes: 0f6ebeee2402 ("net/bnx2x: fix call to link handling periodic function")
Cc: stable@dpdk.org

Signed-off-by: Rasesh Mody <rmody@marvell.com>
---
 drivers/net/bnx2x/bnx2x_ethdev.c |   17 ++++++++++-------
 1 file changed, 10 insertions(+), 7 deletions(-)

diff --git a/drivers/net/bnx2x/bnx2x_ethdev.c b/drivers/net/bnx2x/bnx2x_ethdev.c
index f85766c..3063aea 100644
--- a/drivers/net/bnx2x/bnx2x_ethdev.c
+++ b/drivers/net/bnx2x/bnx2x_ethdev.c
@@ -108,14 +108,15 @@ struct rte_bnx2x_xstats_name_off {
 }
 
 static void
-bnx2x_interrupt_action(struct rte_eth_dev *dev)
+bnx2x_interrupt_action(struct rte_eth_dev *dev, int intr_cxt)
 {
 	struct bnx2x_softc *sc = dev->data->dev_private;
 	uint32_t link_status;
 
 	bnx2x_intr_legacy(sc);
 
-	if (sc->periodic_flags & PERIODIC_GO)
+	if ((atomic_load_acq_long(&sc->periodic_flags) == PERIODIC_GO) &&
+	    !intr_cxt)
 		bnx2x_periodic_callout(sc);
 	link_status = REG_RD(sc, sc->link_params.shmem_base +
 			offsetof(struct shmem_region,
@@ -132,9 +133,7 @@ struct rte_bnx2x_xstats_name_off {
 
 	PMD_DEBUG_PERIODIC_LOG(INFO, sc, "Interrupt handled");
 
-	atomic_store_rel_long(&sc->periodic_flags, PERIODIC_STOP);
-	bnx2x_interrupt_action(dev);
-	atomic_store_rel_long(&sc->periodic_flags, PERIODIC_GO);
+	bnx2x_interrupt_action(dev, 1);
 	rte_intr_enable(&sc->pci_dev->intr_handle);
 }
 
@@ -145,7 +144,7 @@ static void bnx2x_periodic_start(void *param)
 	int ret = 0;
 
 	atomic_store_rel_long(&sc->periodic_flags, PERIODIC_GO);
-	bnx2x_interrupt_action(dev);
+	bnx2x_interrupt_action(dev, 0);
 	if (IS_PF(sc)) {
 		ret = rte_eal_alarm_set(BNX2X_SP_TIMER_PERIOD,
 					bnx2x_periodic_start, (void *)dev);
@@ -165,6 +164,8 @@ void bnx2x_periodic_stop(void *param)
 	atomic_store_rel_long(&sc->periodic_flags, PERIODIC_STOP);
 
 	rte_eal_alarm_cancel(bnx2x_periodic_start, (void *)dev);
+
+	PMD_DRV_LOG(DEBUG, sc, "Periodic poll stopped");
 }
 
 /*
@@ -226,8 +227,10 @@ void bnx2x_periodic_stop(void *param)
 	PMD_INIT_FUNC_TRACE(sc);
 
 	/* start the periodic callout */
-	if (sc->periodic_flags & PERIODIC_STOP)
+	if (atomic_load_acq_long(&sc->periodic_flags) == PERIODIC_STOP) {
 		bnx2x_periodic_start(dev);
+		PMD_DRV_LOG(DEBUG, sc, "Periodic poll re-started");
+	}
 
 	ret = bnx2x_init(sc);
 	if (ret) {
-- 
1.7.10.3


^ permalink raw reply	[flat|nested] 14+ messages in thread

* [dpdk-dev] [PATCH 6/6] net/bnx2x: fix optic module verification
  2019-04-12  1:47 [dpdk-dev] [PATCH 1/6] net/bnx2x: fix eth dev MTU Rasesh Mody
                   ` (4 preceding siblings ...)
  2019-04-12  1:47 ` [dpdk-dev] [PATCH 5/6] net/bnx2x: fix race for periodic flags Rasesh Mody
@ 2019-04-12  1:47 ` Rasesh Mody
  2019-04-12  1:47   ` Rasesh Mody
  2019-04-15  8:01 ` [dpdk-dev] [PATCH 1/6] net/bnx2x: fix eth dev MTU Ferruh Yigit
  6 siblings, 1 reply; 14+ messages in thread
From: Rasesh Mody @ 2019-04-12  1:47 UTC (permalink / raw)
  To: dev; +Cc: Rasesh Mody, ferruh.yigit, GR-Everest-DPDK-Dev, stable

Enable the optic module vendor and part number verification from driver
by setting appropriate flags. Link handling module in conjunction with
FW performs optic module verification.

Without this fix the SFP is powered down and the link doesn't come up,
if module verification is enforced in nvram setting.

Fixes: 540a211084a7 ("bnx2x: driver core")
Cc: stable@dpdk.org

Signed-off-by: Rasesh Mody <rmody@marvell.com>
---
 drivers/net/bnx2x/bnx2x.c |   21 +++++++++++++++++++++
 drivers/net/bnx2x/bnx2x.h |    2 ++
 2 files changed, 23 insertions(+)

diff --git a/drivers/net/bnx2x/bnx2x.c b/drivers/net/bnx2x/bnx2x.c
index f32db6d..3e705c7 100644
--- a/drivers/net/bnx2x/bnx2x.c
+++ b/drivers/net/bnx2x/bnx2x.c
@@ -8103,6 +8103,27 @@ static int bnx2x_get_shmem_info(struct bnx2x_softc *sc)
 		    ~ELINK_FEATURE_CONFIG_OVERRIDE_PREEMPHASIS_ENABLED;
 	}
 
+	val = sc->devinfo.bc_ver >> 8;
+	if (val < BNX2X_BC_VER) {
+		/* for now only warn later we might need to enforce this */
+		PMD_DRV_LOG(NOTICE, sc, "This driver needs bc_ver %X but found %X, please upgrade BC\n",
+			    BNX2X_BC_VER, val);
+	}
+	sc->link_params.feature_config_flags |=
+				(val >= REQ_BC_VER_4_VRFY_FIRST_PHY_OPT_MDL) ?
+				ELINK_FEATURE_CONFIG_BC_SUPPORTS_OPT_MDL_VRFY :
+				0;
+
+	sc->link_params.feature_config_flags |=
+		(val >= REQ_BC_VER_4_VRFY_SPECIFIC_PHY_OPT_MDL) ?
+		ELINK_FEATURE_CONFIG_BC_SUPPORTS_DUAL_PHY_OPT_MDL_VRFY : 0;
+	sc->link_params.feature_config_flags |=
+		(val >= REQ_BC_VER_4_VRFY_AFEX_SUPPORTED) ?
+		ELINK_FEATURE_CONFIG_BC_SUPPORTS_AFEX : 0;
+	sc->link_params.feature_config_flags |=
+		(val >= REQ_BC_VER_4_SFP_TX_DISABLE_SUPPORTED) ?
+		ELINK_FEATURE_CONFIG_BC_SUPPORTS_SFP_TX_DISABLED : 0;
+
 	/* get the initial value of the link params */
 	sc->link_params.multi_phy_config =
 	    SHMEM_RD(sc, dev_info.port_hw_config[port].multi_phy_config);
diff --git a/drivers/net/bnx2x/bnx2x.h b/drivers/net/bnx2x/bnx2x.h
index bb80310..ef1688f 100644
--- a/drivers/net/bnx2x/bnx2x.h
+++ b/drivers/net/bnx2x/bnx2x.h
@@ -119,6 +119,8 @@ int bnx2x_ilog2(int x)
 #define ilog2(x) bnx2x_ilog2(x)
 #endif
 
+#define BNX2X_BC_VER		0x040200
+
 #include "ecore_sp.h"
 
 struct bnx2x_device_type {
-- 
1.7.10.3

^ permalink raw reply	[flat|nested] 14+ messages in thread

* [dpdk-dev] [PATCH 6/6] net/bnx2x: fix optic module verification
  2019-04-12  1:47 ` [dpdk-dev] [PATCH 6/6] net/bnx2x: fix optic module verification Rasesh Mody
@ 2019-04-12  1:47   ` Rasesh Mody
  0 siblings, 0 replies; 14+ messages in thread
From: Rasesh Mody @ 2019-04-12  1:47 UTC (permalink / raw)
  To: dev; +Cc: Rasesh Mody, ferruh.yigit, GR-Everest-DPDK-Dev, stable

Enable the optic module vendor and part number verification from driver
by setting appropriate flags. Link handling module in conjunction with
FW performs optic module verification.

Without this fix the SFP is powered down and the link doesn't come up,
if module verification is enforced in nvram setting.

Fixes: 540a211084a7 ("bnx2x: driver core")
Cc: stable@dpdk.org

Signed-off-by: Rasesh Mody <rmody@marvell.com>
---
 drivers/net/bnx2x/bnx2x.c |   21 +++++++++++++++++++++
 drivers/net/bnx2x/bnx2x.h |    2 ++
 2 files changed, 23 insertions(+)

diff --git a/drivers/net/bnx2x/bnx2x.c b/drivers/net/bnx2x/bnx2x.c
index f32db6d..3e705c7 100644
--- a/drivers/net/bnx2x/bnx2x.c
+++ b/drivers/net/bnx2x/bnx2x.c
@@ -8103,6 +8103,27 @@ static int bnx2x_get_shmem_info(struct bnx2x_softc *sc)
 		    ~ELINK_FEATURE_CONFIG_OVERRIDE_PREEMPHASIS_ENABLED;
 	}
 
+	val = sc->devinfo.bc_ver >> 8;
+	if (val < BNX2X_BC_VER) {
+		/* for now only warn later we might need to enforce this */
+		PMD_DRV_LOG(NOTICE, sc, "This driver needs bc_ver %X but found %X, please upgrade BC\n",
+			    BNX2X_BC_VER, val);
+	}
+	sc->link_params.feature_config_flags |=
+				(val >= REQ_BC_VER_4_VRFY_FIRST_PHY_OPT_MDL) ?
+				ELINK_FEATURE_CONFIG_BC_SUPPORTS_OPT_MDL_VRFY :
+				0;
+
+	sc->link_params.feature_config_flags |=
+		(val >= REQ_BC_VER_4_VRFY_SPECIFIC_PHY_OPT_MDL) ?
+		ELINK_FEATURE_CONFIG_BC_SUPPORTS_DUAL_PHY_OPT_MDL_VRFY : 0;
+	sc->link_params.feature_config_flags |=
+		(val >= REQ_BC_VER_4_VRFY_AFEX_SUPPORTED) ?
+		ELINK_FEATURE_CONFIG_BC_SUPPORTS_AFEX : 0;
+	sc->link_params.feature_config_flags |=
+		(val >= REQ_BC_VER_4_SFP_TX_DISABLE_SUPPORTED) ?
+		ELINK_FEATURE_CONFIG_BC_SUPPORTS_SFP_TX_DISABLED : 0;
+
 	/* get the initial value of the link params */
 	sc->link_params.multi_phy_config =
 	    SHMEM_RD(sc, dev_info.port_hw_config[port].multi_phy_config);
diff --git a/drivers/net/bnx2x/bnx2x.h b/drivers/net/bnx2x/bnx2x.h
index bb80310..ef1688f 100644
--- a/drivers/net/bnx2x/bnx2x.h
+++ b/drivers/net/bnx2x/bnx2x.h
@@ -119,6 +119,8 @@ int bnx2x_ilog2(int x)
 #define ilog2(x) bnx2x_ilog2(x)
 #endif
 
+#define BNX2X_BC_VER		0x040200
+
 #include "ecore_sp.h"
 
 struct bnx2x_device_type {
-- 
1.7.10.3


^ permalink raw reply	[flat|nested] 14+ messages in thread

* Re: [dpdk-dev] [PATCH 1/6] net/bnx2x: fix eth dev MTU
  2019-04-12  1:47 [dpdk-dev] [PATCH 1/6] net/bnx2x: fix eth dev MTU Rasesh Mody
                   ` (5 preceding siblings ...)
  2019-04-12  1:47 ` [dpdk-dev] [PATCH 6/6] net/bnx2x: fix optic module verification Rasesh Mody
@ 2019-04-15  8:01 ` Ferruh Yigit
  2019-04-15  8:01   ` Ferruh Yigit
  6 siblings, 1 reply; 14+ messages in thread
From: Ferruh Yigit @ 2019-04-15  8:01 UTC (permalink / raw)
  To: Rasesh Mody, dev; +Cc: GR-Everest-DPDK-Dev, stable

On 4/12/2019 2:47 AM, Rasesh Mody wrote:
> Fix to update eth dev MTU for jumbo frames
> 
> Fixes: 540a211084a7 ("bnx2x: driver core")
> Cc: stable@dpdk.org
> 
> Signed-off-by: Rasesh Mody <rmody@marvell.com>

Series applied to dpdk-next-net/master, thanks.

^ permalink raw reply	[flat|nested] 14+ messages in thread

* Re: [dpdk-dev] [PATCH 1/6] net/bnx2x: fix eth dev MTU
  2019-04-15  8:01 ` [dpdk-dev] [PATCH 1/6] net/bnx2x: fix eth dev MTU Ferruh Yigit
@ 2019-04-15  8:01   ` Ferruh Yigit
  0 siblings, 0 replies; 14+ messages in thread
From: Ferruh Yigit @ 2019-04-15  8:01 UTC (permalink / raw)
  To: Rasesh Mody, dev; +Cc: GR-Everest-DPDK-Dev, stable

On 4/12/2019 2:47 AM, Rasesh Mody wrote:
> Fix to update eth dev MTU for jumbo frames
> 
> Fixes: 540a211084a7 ("bnx2x: driver core")
> Cc: stable@dpdk.org
> 
> Signed-off-by: Rasesh Mody <rmody@marvell.com>

Series applied to dpdk-next-net/master, thanks.

^ permalink raw reply	[flat|nested] 14+ messages in thread

end of thread, other threads:[~2019-04-15  8:01 UTC | newest]

Thread overview: 14+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2019-04-12  1:47 [dpdk-dev] [PATCH 1/6] net/bnx2x: fix eth dev MTU Rasesh Mody
2019-04-12  1:47 ` Rasesh Mody
2019-04-12  1:47 ` [dpdk-dev] [PATCH 2/6] net/bnx2x: fix memory leak Rasesh Mody
2019-04-12  1:47   ` Rasesh Mody
2019-04-12  1:47 ` [dpdk-dev] [PATCH 3/6] net/bnx2x: fix ramrod timeout Rasesh Mody
2019-04-12  1:47   ` Rasesh Mody
2019-04-12  1:47 ` [dpdk-dev] [PATCH 4/6] net/bnx2x: fix DMAE timeout Rasesh Mody
2019-04-12  1:47   ` Rasesh Mody
2019-04-12  1:47 ` [dpdk-dev] [PATCH 5/6] net/bnx2x: fix race for periodic flags Rasesh Mody
2019-04-12  1:47   ` Rasesh Mody
2019-04-12  1:47 ` [dpdk-dev] [PATCH 6/6] net/bnx2x: fix optic module verification Rasesh Mody
2019-04-12  1:47   ` Rasesh Mody
2019-04-15  8:01 ` [dpdk-dev] [PATCH 1/6] net/bnx2x: fix eth dev MTU Ferruh Yigit
2019-04-15  8:01   ` Ferruh Yigit

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).