When the shared Tx scatter-gather mempool cannot be created,
rte_dpaa_probe() returns -ENOMEM directly:

Unwind through cleanup labels so the failure path closes the device and
releases the port, matching the existing dpaa_dev_init() failure path.

Fixes: 533c31cc8331 ("net/dpaa: use internal mempool for SG table")
Cc: [email protected]

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

diff --git a/drivers/net/dpaa/dpaa_ethdev.c b/drivers/net/dpaa/dpaa_ethdev.c
index 10b90417de..2f6e2d20a3 100644
--- a/drivers/net/dpaa/dpaa_ethdev.c
+++ b/drivers/net/dpaa/dpaa_ethdev.c
@@ -2602,24 +2602,30 @@ rte_dpaa_probe(struct rte_dpaa_driver *dpaa_drv,
 
        /* Invoke PMD device initialization function */
        diag = dpaa_dev_init(eth_dev);
-       if (diag == 0) {
-               if (!dpaa_tx_sg_pool) {
-                       dpaa_tx_sg_pool =
-                               rte_pktmbuf_pool_create("dpaa_mbuf_tx_sg_pool",
-                               DPAA_POOL_SIZE,
-                               DPAA_POOL_CACHE_SIZE, 0,
-                               DPAA_MAX_SGS * sizeof(struct qm_sg_entry),
-                               rte_socket_id());
-                       if (dpaa_tx_sg_pool == NULL) {
-                               DPAA_PMD_ERR("SG pool creation failed");
-                               return -ENOMEM;
-                       }
+       if (diag != 0)
+               goto release_port;
+
+       if (dpaa_tx_sg_pool == NULL) {
+               dpaa_tx_sg_pool =
+                       rte_pktmbuf_pool_create("dpaa_mbuf_tx_sg_pool",
+                       DPAA_POOL_SIZE,
+                       DPAA_POOL_CACHE_SIZE, 0,
+                       DPAA_MAX_SGS * sizeof(struct qm_sg_entry),
+                       rte_socket_id());
+               if (dpaa_tx_sg_pool == NULL) {
+                       DPAA_PMD_ERR("SG pool creation failed");
+                       diag = -ENOMEM;
+                       goto close_dev;
                }
-               rte_eth_dev_probing_finish(eth_dev);
-               dpaa_valid_dev++;
-               return 0;
        }
 
+       rte_eth_dev_probing_finish(eth_dev);
+       dpaa_valid_dev++;
+       return 0;
+
+close_dev:
+       dpaa_eth_dev_close(eth_dev);
+release_port:
        rte_eth_dev_release_port(eth_dev);
        return diag;
 }
-- 
2.25.1

Reply via email to