net/bnxt: fix crash caused by error recovery

bnxt_stop_rxtx() does not stop data path processing as intended
as it does not update the recently introduced fast-path pointers
'(struct rte_eth_fp_ops)->rx_pkt_burst'. Since both the burst routines
only use the fast-path pointer, the real burst routines get invoked
instead of the dummy ones set by bnxt_stop_rxtx() leading to crashes
in the data path (e.g. dereferencing freed structures)

Fix the segfault by updating the fast-path pointer as well

Fixes: c87d435a4d ("ethdev: copy fast-path API into separate structure")

Signed-off-by: Somnath Kotur <somnath.kotur@broadcom.com>
Reviewed-by: Ajit Khaparde <ajit.khaparde@broadcom.com>
This commit is contained in:
Somnath Kotur 2021-11-19 09:20:41 +05:30 committed by Ajit Khaparde
parent e806385c6d
commit 720b55ad27
2 changed files with 21 additions and 1 deletions

View File

@ -387,4 +387,13 @@ void bnxt_stop_rxtx(struct bnxt *bp)
{
bp->eth_dev->rx_pkt_burst = &bnxt_dummy_recv_pkts;
bp->eth_dev->tx_pkt_burst = &bnxt_dummy_xmit_pkts;
rte_eth_fp_ops[bp->eth_dev->data->port_id].rx_pkt_burst =
bp->eth_dev->rx_pkt_burst;
rte_eth_fp_ops[bp->eth_dev->data->port_id].tx_pkt_burst =
bp->eth_dev->tx_pkt_burst;
rte_mb();
/* Allow time for threads to exit the real burst functions. */
rte_delay_ms(100);
}

View File

@ -4323,6 +4323,8 @@ static void bnxt_dev_recover(void *arg)
/* Clear Error flag so that device re-init should happen */
bp->flags &= ~BNXT_FLAG_FATAL_ERROR;
PMD_DRV_LOG(INFO, "Port: %u Starting recovery...\n",
bp->eth_dev->data->port_id);
rc = bnxt_check_fw_ready(bp);
if (rc)
@ -4343,11 +4345,18 @@ static void bnxt_dev_recover(void *arg)
goto err_start;
}
rte_eth_fp_ops[bp->eth_dev->data->port_id].rx_pkt_burst =
bp->eth_dev->rx_pkt_burst;
rte_eth_fp_ops[bp->eth_dev->data->port_id].tx_pkt_burst =
bp->eth_dev->tx_pkt_burst;
rte_mb();
rc = bnxt_restore_filters(bp);
if (rc)
goto err_start;
PMD_DRV_LOG(INFO, "Recovered from FW reset\n");
PMD_DRV_LOG(INFO, "Port: %u Recovered from FW reset\n",
bp->eth_dev->data->port_id);
pthread_mutex_unlock(&bp->err_recovery_lock);
return;
@ -4372,6 +4381,8 @@ void bnxt_dev_reset_and_resume(void *arg)
int rc;
bnxt_dev_cleanup(bp);
PMD_DRV_LOG(INFO, "Port: %u Finished bnxt_dev_cleanup\n",
bp->eth_dev->data->port_id);
bnxt_wait_for_device_shutdown(bp);