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:
parent
e806385c6d
commit
720b55ad27
@ -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);
|
||||
}
|
||||
|
@ -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);
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user