dpaa_intf->tx_conf_queues is allocated unconditionally for every port
in dpaa_dev_init():

        dpaa_intf->tx_conf_queues = rte_zmalloc(NULL, sizeof(struct qman_fq) *
                MAX_DPAA_CORES, MAX_CACHELINE);

but it is never released. It is a driver private allocation, so
rte_eth_dev_release_port() does not free it either. The memory is
therefore leaked on every device close and on every probe failure that
happens after the allocation.

Free it in dpaa_eth_dev_close() next to tx_queues, and in the free_tx
error path of dpaa_dev_init(). The private data is allocated with
rte_zmalloc(), so the pointer is NULL on the error paths taken before
the allocation and rte_free() is a no-op there.

Fixes: 58e0420f72f8 ("net/dpaa: support Tx confirmation to enable PTP")
Cc: [email protected]

Signed-off-by: Hemant Agrawal <[email protected]>
---
 drivers/net/dpaa/dpaa_ethdev.c | 5 +++++
 1 file changed, 5 insertions(+)

diff --git a/drivers/net/dpaa/dpaa_ethdev.c b/drivers/net/dpaa/dpaa_ethdev.c
index 77730f16e3..86b1675c29 100644
--- a/drivers/net/dpaa/dpaa_ethdev.c
+++ b/drivers/net/dpaa/dpaa_ethdev.c
@@ -624,6 +624,9 @@ static int dpaa_eth_dev_close(struct rte_eth_dev *dev)
                }
        }
 
+       rte_free(dpaa_intf->tx_conf_queues);
+       dpaa_intf->tx_conf_queues = NULL;
+
        return ret;
 }
 
@@ -2497,6 +2500,8 @@ dpaa_dev_init(struct rte_eth_dev *eth_dev)
        return 0;
 
 free_tx:
+       rte_free(dpaa_intf->tx_conf_queues);
+       dpaa_intf->tx_conf_queues = NULL;
        rte_free(dpaa_intf->tx_queues);
        dpaa_intf->tx_queues = NULL;
        dpaa_intf->nb_tx_queues = 0;
-- 
2.25.1

Reply via email to