From: Qiming Yang Date: Thu, 19 May 2022 05:01:56 +0000 (+0000) Subject: net/iavf: fix queue start exception handling X-Git-Url: http://git.droids-corp.org/?a=commitdiff_plain;h=1fa739c3f2b3876d21e506c024a3c6bee6562943;p=dpdk.git net/iavf: fix queue start exception handling If any queue start fail during dev_start, all started queues should be stopped. Fixes: 69dd4c3d0898 ("net/avf: enable queue and device") Cc: stable@dpdk.org Signed-off-by: Qiming Yang Acked-by: Qi Zhang --- diff --git a/drivers/net/iavf/iavf_ethdev.c b/drivers/net/iavf/iavf_ethdev.c index 198d8299af..315ab15aad 100644 --- a/drivers/net/iavf/iavf_ethdev.c +++ b/drivers/net/iavf/iavf_ethdev.c @@ -926,28 +926,38 @@ iavf_start_queues(struct rte_eth_dev *dev) struct iavf_rx_queue *rxq; struct iavf_tx_queue *txq; int i; + uint16_t nb_txq, nb_rxq; - for (i = 0; i < dev->data->nb_tx_queues; i++) { - txq = dev->data->tx_queues[i]; + for (nb_txq = 0; nb_txq < dev->data->nb_tx_queues; nb_txq++) { + txq = dev->data->tx_queues[nb_txq]; if (txq->tx_deferred_start) continue; - if (iavf_dev_tx_queue_start(dev, i) != 0) { - PMD_DRV_LOG(ERR, "Fail to start queue %u", i); - return -1; + if (iavf_dev_tx_queue_start(dev, nb_txq) != 0) { + PMD_DRV_LOG(ERR, "Fail to start tx queue %u", nb_txq); + goto tx_err; } } - for (i = 0; i < dev->data->nb_rx_queues; i++) { - rxq = dev->data->rx_queues[i]; + for (nb_rxq = 0; nb_rxq < dev->data->nb_rx_queues; nb_rxq++) { + rxq = dev->data->rx_queues[nb_rxq]; if (rxq->rx_deferred_start) continue; - if (iavf_dev_rx_queue_start(dev, i) != 0) { - PMD_DRV_LOG(ERR, "Fail to start queue %u", i); - return -1; + if (iavf_dev_rx_queue_start(dev, nb_rxq) != 0) { + PMD_DRV_LOG(ERR, "Fail to start rx queue %u", nb_rxq); + goto rx_err; } } return 0; + +rx_err: + for (i = 0; i < nb_rxq; i++) + iavf_dev_rx_queue_stop(dev, i); +tx_err: + for (i = 0; i < nb_txq; i++) + iavf_dev_tx_queue_stop(dev, i); + + return -1; } static int