This patch fixes deallocation of all fastpath resources unconditionally,
when re-configuring the device. When re-allocating resources PMD depends
on application to explicitly setup the Rx/Tx queue.

Deallocation of all the resources is only required if the Rx/Tx queue
configuration changes. For other scenarios like KNI MTU change we'd keep
existing configuration.

Fixes: 8de0c4201926 ("net/qede: fix odd number of queues usage in 100G
mode")
Fixes: dd28bc8c6ef4 ("net/qede: fix VF port creation sequence")
Cc: sta...@dpdk.org

Signed-off-by: Rasesh Mody <rm...@marvell.com>
Signed-off-by: Igor Russkikh <irussk...@marvell.com>
---
 drivers/net/qede/qede_ethdev.c | 19 +++++++++++++------
 drivers/net/qede/qede_rxtx.c   |  4 +++-
 2 files changed, 16 insertions(+), 7 deletions(-)

diff --git a/drivers/net/qede/qede_ethdev.c b/drivers/net/qede/qede_ethdev.c
index d3d916e81..c4f8f1258 100644
--- a/drivers/net/qede/qede_ethdev.c
+++ b/drivers/net/qede/qede_ethdev.c
@@ -1273,6 +1273,8 @@ static int qede_dev_configure(struct rte_eth_dev *eth_dev)
        struct qede_dev *qdev = QEDE_INIT_QDEV(eth_dev);
        struct ecore_dev *edev = QEDE_INIT_EDEV(qdev);
        struct rte_eth_rxmode *rxmode = &eth_dev->data->dev_conf.rxmode;
+       uint8_t num_rxqs;
+       uint8_t num_txqs;
        int ret;
 
        PMD_INIT_FUNC_TRACE(edev);
@@ -1305,12 +1307,17 @@ static int qede_dev_configure(struct rte_eth_dev 
*eth_dev)
        if (qede_check_fdir_support(eth_dev))
                return -ENOTSUP;
 
-       qede_dealloc_fp_resc(eth_dev);
-       qdev->num_tx_queues = eth_dev->data->nb_tx_queues * edev->num_hwfns;
-       qdev->num_rx_queues = eth_dev->data->nb_rx_queues * edev->num_hwfns;
-
-       if (qede_alloc_fp_resc(qdev))
-               return -ENOMEM;
+       /* Allocate/reallocate fastpath resources only for new queue config */
+       num_txqs = eth_dev->data->nb_tx_queues * edev->num_hwfns;
+       num_rxqs = eth_dev->data->nb_rx_queues * edev->num_hwfns;
+       if (qdev->num_tx_queues != num_txqs ||
+           qdev->num_rx_queues != num_rxqs) {
+               qede_dealloc_fp_resc(eth_dev);
+               qdev->num_tx_queues = num_txqs;
+               qdev->num_rx_queues = num_rxqs;
+               if (qede_alloc_fp_resc(qdev))
+                       return -ENOMEM;
+       }
 
        /* If jumbo enabled adjust MTU */
        if (rxmode->offloads & DEV_RX_OFFLOAD_JUMBO_FRAME)
diff --git a/drivers/net/qede/qede_rxtx.c b/drivers/net/qede/qede_rxtx.c
index b81788ca4..9878ba50e 100644
--- a/drivers/net/qede/qede_rxtx.c
+++ b/drivers/net/qede/qede_rxtx.c
@@ -593,12 +593,14 @@ qede_alloc_mem_sb(struct qede_dev *qdev, struct 
ecore_sb_info *sb_info,
 
 int qede_alloc_fp_resc(struct qede_dev *qdev)
 {
-       struct ecore_dev *edev = &qdev->edev;
+       struct ecore_dev *edev = QEDE_INIT_EDEV(qdev);
        struct qede_fastpath *fp;
        uint32_t num_sbs;
        uint16_t sb_idx;
        int i;
 
+       PMD_INIT_FUNC_TRACE(edev);
+
        if (IS_VF(edev))
                ecore_vf_get_num_sbs(ECORE_LEADING_HWFN(edev), &num_sbs);
        else
-- 
2.18.0

Reply via email to