[4/4] net/bnxt: fix ULP context list deadlock

Message ID 20211116130437.2022-5-venkatkumar.duvvuru@broadcom.com (mailing list archive)
State Accepted, archived
Delegated to: Ajit Khaparde
Headers
Series fixes to TruFlow |

Checks

Context Check Description
ci/checkpatch success coding style OK
ci/Intel-compilation success Compilation OK
ci/intel-Testing success Testing PASS
ci/github-robot: build success github build: passed
ci/iol-mellanox-Performance success Performance Testing PASS
ci/iol-broadcom-Performance success Performance Testing PASS
ci/iol-broadcom-Functional success Functional Testing PASS
ci/iol-x86_64-unit-testing success Testing PASS
ci/iol-x86_64-compile-testing success Testing PASS
ci/iol-aarch64-unit-testing success Testing PASS
ci/iol-intel-Functional success Functional Testing PASS
ci/iol-intel-Performance success Performance Testing PASS
ci/iol-aarch64-compile-testing success Testing PASS

Commit Message

Venkat Duvvuru Nov. 16, 2021, 1:04 p.m. UTC
  From: Kishore Padmanabha <kishore.padmanabha@broadcom.com>

The ulp context list was not updated when high availability
feature was deinitialized. This caused the ulp context list
to acquire the lock when it is not supposed to causing the
deadlock. The fix is to correctly clear the list.

Fixes: 3184b1ef666a ("net/bnxt: add HA support in ULP")
Signed-off-by: Kishore Padmanabha <kishore.padmanabha@broadcom.com>
Signed-off-by: Venkat Duvvuru <venkatkumar.duvvuru@broadcom.com>
Reviewed-by: Michael Baucom <michael.baucom@broadcom.com>
Reviewed-by: Randy Schacher <stuart.schacher@broadcom.com>
---
 drivers/net/bnxt/tf_ulp/bnxt_ulp.c   | 7 ++++---
 drivers/net/bnxt/tf_ulp/ulp_ha_mgr.c | 8 ++++----
 2 files changed, 8 insertions(+), 7 deletions(-)
  

Patch

diff --git a/drivers/net/bnxt/tf_ulp/bnxt_ulp.c b/drivers/net/bnxt/tf_ulp/bnxt_ulp.c
index b1b8679aa6..1ee21fceef 100644
--- a/drivers/net/bnxt/tf_ulp/bnxt_ulp.c
+++ b/drivers/net/bnxt/tf_ulp/bnxt_ulp.c
@@ -1546,9 +1546,6 @@  bnxt_ulp_port_deinit(struct bnxt *bp)
 	BNXT_TF_DBG(DEBUG, "BNXT Port:%d ULP port deinit\n",
 		    bp->eth_dev->data->port_id);
 
-	/* Free the ulp context in the context entry list */
-	bnxt_ulp_cntxt_list_del(bp->ulp_ctx);
-
 	/* Get the session details  */
 	pci_dev = RTE_DEV_TO_PCI(bp->eth_dev->device);
 	pci_addr = &pci_dev->addr;
@@ -1587,6 +1584,9 @@  bnxt_ulp_port_deinit(struct bnxt *bp)
 		}
 	}
 
+	/* Free the ulp context in the context entry list */
+	bnxt_ulp_cntxt_list_del(bp->ulp_ctx);
+
 	/* clean up the session */
 	ulp_session_deinit(session);
 
@@ -2062,6 +2062,7 @@  bnxt_ulp_cntxt_entry_acquire(void *arg)
 		TAILQ_FOREACH(entry, &ulp_cntx_list, next)
 			if (entry->ulp_ctx->cfg_data == arg)
 				return entry->ulp_ctx;
+		rte_spinlock_unlock(&bnxt_ulp_ctxt_lock);
 	}
 	return NULL;
 }
diff --git a/drivers/net/bnxt/tf_ulp/ulp_ha_mgr.c b/drivers/net/bnxt/tf_ulp/ulp_ha_mgr.c
index 1325986aba..0030a487f5 100644
--- a/drivers/net/bnxt/tf_ulp/ulp_ha_mgr.c
+++ b/drivers/net/bnxt/tf_ulp/ulp_ha_mgr.c
@@ -26,7 +26,7 @@ 
 #define ULP_HA_IF_TBL_IDX 10
 #define ULP_HA_CLIENT_CNT_IF_TBL_IDX 9
 
-static void ulp_ha_mgr_timer_cancel(void);
+static void ulp_ha_mgr_timer_cancel(struct bnxt_ulp_context *ulp_ctx);
 static int32_t ulp_ha_mgr_timer_start(void *arg);
 static void ulp_ha_mgr_timer_cb(void *arg);
 static int32_t ulp_ha_mgr_app_type_set(struct bnxt_ulp_context *ulp_ctx,
@@ -311,9 +311,9 @@  ulp_ha_mgr_timer_start(void *arg)
 }
 
 static void
-ulp_ha_mgr_timer_cancel(void)
+ulp_ha_mgr_timer_cancel(struct bnxt_ulp_context *ulp_ctx)
 {
-	rte_eal_alarm_cancel(ulp_ha_mgr_timer_cb, (void *)NULL);
+	rte_eal_alarm_cancel(ulp_ha_mgr_timer_cb, ulp_ctx->cfg_data);
 }
 
 int32_t
@@ -351,7 +351,7 @@  ulp_ha_mgr_deinit(struct bnxt_ulp_context *ulp_ctx)
 {
 	struct bnxt_ulp_ha_mgr_info *ha_info;
 
-	ulp_ha_mgr_timer_cancel();
+	ulp_ha_mgr_timer_cancel(ulp_ctx);
 
 	ha_info = bnxt_ulp_cntxt_ptr2_ha_info_get(ulp_ctx);
 	if (ha_info == NULL) {