[4/5] examples/l2fwd-cat: free resources in case of error
Checks
Commit Message
Freeing the resources and call rte_eal_cleanup in case of error exit.
Signed-off-by: Muhammad Bilal <m.bilal@emumba.com>
---
examples/l2fwd-cat/l2fwd-cat.c | 32 ++++++++++++++++++++++++++------
1 file changed, 26 insertions(+), 6 deletions(-)
@@ -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");