Freeing the resources and call rte_eal_cleanup in case of error exit.
Signed-off-by: Muhammad Bilal <m.bi...@emumba.com>
---
 examples/l2fwd-cat/l2fwd-cat.c | 32 ++++++++++++++++++++++++++------
 1 file changed, 26 insertions(+), 6 deletions(-)

diff --git a/examples/l2fwd-cat/l2fwd-cat.c b/examples/l2fwd-cat/l2fwd-cat.c
index 45a497c08..06eeae9ae 100644
--- a/examples/l2fwd-cat/l2fwd-cat.c
+++ b/examples/l2fwd-cat/l2fwd-cat.c
@@ -147,6 +147,18 @@ lcore_main(void)
        }
 }
 
+static void
+stop_and_close_eth_dev(uint16_t portid)
+{
+       RTE_ETH_FOREACH_DEV(portid) {
+               printf("Closing port %d...", portid);
+               rte_eth_dev_stop(portid);
+               rte_eth_dev_close(portid);
+               printf(" Done\n");
+       }
+       rte_eal_cleanup();
+}
+
 /*
  * The main function, which does initialization and calls the per-lcore
  * functions.
@@ -156,7 +168,7 @@ main(int argc, char *argv[])
 {
        struct rte_mempool *mbuf_pool;
        unsigned nb_ports;
-       uint16_t portid;
+       uint16_t portid = 0;
 
        /* Initialize the Environment Abstraction Layer (EAL). */
        int ret = rte_eal_init(argc, argv);
@@ -171,30 +183,38 @@ main(int argc, char *argv[])
         * Please see l2fwd-cat documentation for more info.
         */
        ret = cat_init(argc, argv);
-       if (ret < 0)
+       if (ret < 0) {
+               stop_and_close_eth_dev(portid);
                rte_exit(EXIT_FAILURE, "PQOS: L3CA init failed!\n");
+       }
 
        argc -= ret;
        argv += ret;
 
        /* Check that there is an even number of ports to send/receive on. */
        nb_ports = rte_eth_dev_count_avail();
-       if (nb_ports < 2 || (nb_ports & 1))
+       if (nb_ports < 2 || (nb_ports & 1)) {
+               stop_and_close_eth_dev(portid);
                rte_exit(EXIT_FAILURE, "Error: number of ports must be even\n");
+       }
 
        /* Creates a new mempool in memory to hold the mbufs. */
        mbuf_pool = rte_pktmbuf_pool_create("MBUF_POOL", NUM_MBUFS * nb_ports,
                MBUF_CACHE_SIZE, 0, RTE_MBUF_DEFAULT_BUF_SIZE, rte_socket_id());
 
-       if (mbuf_pool == NULL)
+       if (mbuf_pool == NULL) {
+               stop_and_close_eth_dev(portid);
                rte_exit(EXIT_FAILURE, "Cannot create mbuf pool\n");
+       }
 
        /* Initialize all ports. */
        RTE_ETH_FOREACH_DEV(portid)
-               if (port_init(portid, mbuf_pool) != 0)
+               if (port_init(portid, mbuf_pool) != 0) {
+                       stop_and_close_eth_dev(portid);
                        rte_exit(EXIT_FAILURE, "Cannot init port %"PRIu16 "\n",
                                        portid);
-
+               }
+
        if (rte_lcore_count() > 1)
                printf("\nWARNING: Too many lcores enabled. Only 1 used.\n");
 
-- 
2.17.1

Reply via email to