net/bnxt: fix ULP context list deadlock
authorKishore Padmanabha <kishore.padmanabha@broadcom.com>
Tue, 16 Nov 2021 13:04:37 +0000 (18:34 +0530)
committerAjit Khaparde <ajit.khaparde@broadcom.com>
Tue, 16 Nov 2021 23:14:30 +0000 (00:14 +0100)
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 a
deadlock. The fix is to correctly clear the list.

Fixes: 3184b1ef666a ("net/bnxt: add HA support in ULP")
Cc: stable@dpdk.org
Signed-off-by: Kishore Padmanabha <kishore.padmanabha@broadcom.com>
Signed-off-by: Venkat Duvvuru <venkatkumar.duvvuru@broadcom.com>
Reviewed-by: Mike Baucom <michael.baucom@broadcom.com>
Reviewed-by: Randy Schacher <stuart.schacher@broadcom.com>
Reviewed-by: Ajit Khaparde <ajit.khaparde@broadcom.com>
drivers/net/bnxt/tf_ulp/bnxt_ulp.c
drivers/net/bnxt/tf_ulp/ulp_ha_mgr.c

index b1b8679..1ee21fc 100644 (file)
@@ -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;
 }
index 1325986..0030a48 100644 (file)
@@ -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) {