[v4,3/7] net/bnxt: fix race-condition when report error recovery
Checks
Commit Message
If set data path functions to dummy functions before reports error
recovering event, there maybe a race-condition with data path threads,
this patch fixes it by setting data path functions to dummy functions
only after reports such event.
Fixes: e11052f3a46f ("net/bnxt: support proactive error handling mode")
Cc: stable@dpdk.org
Signed-off-by: Chengwen Feng <fengchengwen@huawei.com>
Acked-by: Konstantin Ananyev <konstantin.ananyev@huawei.com>
Acked-by: Ajit Khaparde <ajit.khaparde@broadcom.com>
---
drivers/net/bnxt/bnxt_cpr.c | 13 +++++++------
drivers/net/bnxt/bnxt_ethdev.c | 4 ++--
2 files changed, 9 insertions(+), 8 deletions(-)
@@ -189,14 +189,9 @@ void bnxt_handle_async_event(struct bnxt *bp,
PMD_DRV_LOG(INFO, "Port conn async event\n");
break;
case HWRM_ASYNC_EVENT_CMPL_EVENT_ID_RESET_NOTIFY:
- /*
- * Avoid any rx/tx packet processing during firmware reset
- * operation.
- */
- bnxt_stop_rxtx(bp->eth_dev);
-
/* Ignore reset notify async events when stopping the port */
if (!bp->eth_dev->data->dev_started) {
+ bnxt_stop_rxtx(bp->eth_dev);
bp->flags |= BNXT_FLAG_FATAL_ERROR;
return;
}
@@ -205,6 +200,12 @@ void bnxt_handle_async_event(struct bnxt *bp,
RTE_ETH_EVENT_ERR_RECOVERING,
NULL);
+ /*
+ * Avoid any rx/tx packet processing during firmware reset
+ * operation.
+ */
+ bnxt_stop_rxtx(bp->eth_dev);
+
pthread_mutex_lock(&bp->err_recovery_lock);
event_data = data1;
/* timestamp_lo/hi values are in units of 100ms */
@@ -4738,14 +4738,14 @@ static void bnxt_check_fw_health(void *arg)
bp->flags |= BNXT_FLAG_FATAL_ERROR;
bp->flags |= BNXT_FLAG_FW_RESET;
- bnxt_stop_rxtx(bp->eth_dev);
-
PMD_DRV_LOG(ERR, "Detected FW dead condition\n");
rte_eth_dev_callback_process(bp->eth_dev,
RTE_ETH_EVENT_ERR_RECOVERING,
NULL);
+ bnxt_stop_rxtx(bp->eth_dev);
+
if (bnxt_is_primary_func(bp))
wait_msec = info->primary_func_wait_period;
else