From: Bruce Richardson <bruce.richardson@intel.com>
To: dev@dpdk.org
Cc: david.marchand@redhat.com,
Bruce Richardson <bruce.richardson@intel.com>,
Tyler Retzlaff <roretzla@linux.microsoft.com>,
Dmitry Kozlyuk <dmitry.kozliuk@gmail.com>
Subject: [PATCH v3 7/9] eal: ensure proper cleanup on EAL init failure
Date: Fri, 18 Jul 2025 15:33:53 +0100 [thread overview]
Message-ID: <20250718143356.1578988-8-bruce.richardson@intel.com> (raw)
In-Reply-To: <20250718143356.1578988-1-bruce.richardson@intel.com>
When rte_eal_init fails part way through, any saved EAL arguments need
to be freed, and the run_once flag needs to be set back to zero again.
The former task was never done on failure, and the latter was only done
on some occasions. Rework the error handling to always go to an err_out
label where cleanup is done.
To prevent memory leaks from the saved arguments when eal_init is called
twice, the check for multiple calls must be done first before the
argument saving and parsing is done.
This patch modifies all three eal.c files. Windows doesn't actually need
changes, since there are no args saved, and no run_once sentinel value,
but updating it keeps it consistent with FreeBSD and Linux versions.
Signed-off-by: Bruce Richardson <bruce.richardson@intel.com>
---
NOTE: this patch can probably be squashed in with the changes in the
previous one, but for easier review I've kept it separate for now.
---
lib/eal/common/eal_common_options.c | 37 ++++++++----
lib/eal/common/eal_options.h | 1 +
lib/eal/freebsd/eal.c | 83 +++++++++++++-------------
lib/eal/linux/eal.c | 90 ++++++++++++++---------------
lib/eal/windows/eal.c | 47 ++++++++-------
5 files changed, 137 insertions(+), 121 deletions(-)
diff --git a/lib/eal/common/eal_common_options.c b/lib/eal/common/eal_common_options.c
index eecb8eba3a..646f47f886 100644
--- a/lib/eal/common/eal_common_options.c
+++ b/lib/eal/common/eal_common_options.c
@@ -357,6 +357,8 @@ rte_set_application_usage_hook(rte_usage_hook_t usage_func)
int
eal_save_args(__rte_unused int argc, __rte_unused char **argv) { return 0; }
+void
+eal_clean_saved_args(void) { /* no-op */ }
#else /* RTE_EXEC_ENV_WINDOWS */
static char **eal_args;
@@ -388,6 +390,28 @@ handle_eal_info_request(const char *cmd, const char *params __rte_unused,
return used;
}
+void
+eal_clean_saved_args(void)
+{
+ int i;
+
+ if (eal_args == NULL)
+ return;
+
+ if (eal_app_args != NULL) {
+ i = 0;
+ while (eal_app_args[i] != NULL)
+ free(eal_app_args[i++]);
+ free(eal_app_args);
+ eal_app_args = NULL;
+ }
+ i = 0;
+ while (eal_args[i] != NULL)
+ free(eal_args[i++]);
+ free(eal_args);
+ eal_args = NULL;
+}
+
int
eal_save_args(int argc, char **argv)
{
@@ -432,18 +456,7 @@ eal_save_args(int argc, char **argv)
return 0;
error:
- if (eal_app_args != NULL) {
- i = 0;
- while (eal_app_args[i] != NULL)
- free(eal_app_args[i++]);
- free(eal_app_args);
- eal_app_args = NULL;
- }
- i = 0;
- while (eal_args[i] != NULL)
- free(eal_args[i++]);
- free(eal_args);
- eal_args = NULL;
+ eal_clean_saved_args();
return -1;
}
#endif /* !RTE_EXEC_ENV_WINDOWS */
diff --git a/lib/eal/common/eal_options.h b/lib/eal/common/eal_options.h
index c4d2cc84dc..fd28111e73 100644
--- a/lib/eal/common/eal_options.h
+++ b/lib/eal/common/eal_options.h
@@ -124,6 +124,7 @@ int eal_check_common_options(struct internal_config *internal_cfg);
enum rte_proc_type_t eal_proc_type_detect(void);
int eal_plugins_init(void);
int eal_save_args(int argc, char **argv);
+void eal_clean_saved_args(void);
int handle_eal_info_request(const char *cmd, const char *params __rte_unused,
struct rte_tel_data *d);
diff --git a/lib/eal/freebsd/eal.c b/lib/eal/freebsd/eal.c
index ee8bf92bff..2882d218f6 100644
--- a/lib/eal/freebsd/eal.c
+++ b/lib/eal/freebsd/eal.c
@@ -418,6 +418,14 @@ rte_eal_init(int argc, char **argv)
bool has_phys_addr;
enum rte_iova_mode iova_mode;
+ /* first check if we have been run before */
+ if (!rte_atomic_compare_exchange_strong_explicit(&run_once, &has_run, 1,
+ rte_memory_order_relaxed, rte_memory_order_relaxed)) {
+ rte_eal_init_alert("already called initialization.");
+ rte_errno = EALREADY;
+ return -1;
+ }
+
/* Save and collate args at the top */
eal_save_args(argc, argv);
@@ -425,14 +433,14 @@ rte_eal_init(int argc, char **argv)
if (fctret < 0) {
rte_eal_init_alert("invalid command-line arguments.");
rte_errno = EINVAL;
- return -1;
+ goto err_out;
}
/* setup log as early as possible */
if (eal_parse_log_options() < 0) {
rte_eal_init_alert("invalid log arguments.");
rte_errno = EINVAL;
- return -1;
+ goto err_out;
}
eal_log_init(getprogname());
@@ -441,21 +449,14 @@ rte_eal_init(int argc, char **argv)
if (!rte_cpu_is_supported()) {
rte_eal_init_alert("unsupported cpu type.");
rte_errno = ENOTSUP;
- return -1;
+ goto err_out;
}
/* verify if DPDK supported on architecture MMU */
if (!eal_mmu_supported()) {
rte_eal_init_alert("unsupported MMU type.");
rte_errno = ENOTSUP;
- return -1;
- }
-
- if (!rte_atomic_compare_exchange_strong_explicit(&run_once, &has_run, 1,
- rte_memory_order_relaxed, rte_memory_order_relaxed)) {
- rte_eal_init_alert("already called initialization.");
- rte_errno = EALREADY;
- return -1;
+ goto err_out;
}
eal_reset_internal_config(internal_conf);
@@ -463,14 +464,13 @@ rte_eal_init(int argc, char **argv)
if (rte_eal_cpu_init() < 0) {
rte_eal_init_alert("Cannot detect lcores.");
rte_errno = ENOTSUP;
- return -1;
+ goto err_out;
}
if (eal_parse_args() < 0) {
rte_eal_init_alert("Error parsing command-line arguments.");
rte_errno = EINVAL;
- rte_atomic_store_explicit(&run_once, 0, rte_memory_order_relaxed);
- return -1;
+ goto err_out;
}
/* FreeBSD always uses legacy memory model */
@@ -483,37 +483,34 @@ rte_eal_init(int argc, char **argv)
if (eal_plugins_init() < 0) {
rte_eal_init_alert("Cannot init plugins");
rte_errno = EINVAL;
- rte_atomic_store_explicit(&run_once, 0, rte_memory_order_relaxed);
- return -1;
+ goto err_out;
}
if (eal_trace_init() < 0) {
rte_eal_init_alert("Cannot init trace");
rte_errno = EFAULT;
- rte_atomic_store_explicit(&run_once, 0, rte_memory_order_relaxed);
- return -1;
+ goto err_out;
}
if (eal_option_device_parse()) {
rte_errno = ENODEV;
- rte_atomic_store_explicit(&run_once, 0, rte_memory_order_relaxed);
- return -1;
+ goto err_out;
}
if (rte_config_init() < 0) {
rte_eal_init_alert("Cannot init config");
- return -1;
+ goto err_out;
}
if (rte_eal_intr_init() < 0) {
rte_eal_init_alert("Cannot init interrupt-handling thread");
- return -1;
+ goto err_out;
}
if (rte_eal_alarm_init() < 0) {
rte_eal_init_alert("Cannot init alarm");
/* rte_eal_alarm_init sets rte_errno on failure. */
- return -1;
+ goto err_out;
}
/* Put mp channel init before bus scan so that we can init the vdev
@@ -523,15 +520,14 @@ rte_eal_init(int argc, char **argv)
rte_eal_init_alert("failed to init mp channel");
if (rte_eal_process_type() == RTE_PROC_PRIMARY) {
rte_errno = EFAULT;
- return -1;
+ goto err_out;
}
}
if (rte_bus_scan()) {
rte_eal_init_alert("Cannot scan the buses for devices");
rte_errno = ENODEV;
- rte_atomic_store_explicit(&run_once, 0, rte_memory_order_relaxed);
- return -1;
+ goto err_out;
}
/*
@@ -562,13 +558,13 @@ rte_eal_init(int argc, char **argv)
if (iova_mode == RTE_IOVA_PA && !has_phys_addr) {
rte_eal_init_alert("Cannot use IOVA as 'PA' since physical addresses are not available");
rte_errno = EINVAL;
- return -1;
+ goto err_out;
}
if (iova_mode == RTE_IOVA_PA && !RTE_IOVA_IN_MBUF) {
rte_eal_init_alert("Cannot use IOVA as 'PA' as it is disabled during build");
rte_errno = EINVAL;
- return -1;
+ goto err_out;
}
rte_eal_get_configuration()->iova_mode = iova_mode;
@@ -583,8 +579,7 @@ rte_eal_init(int argc, char **argv)
if (ret < 0) {
rte_eal_init_alert("Cannot get hugepage information.");
rte_errno = EACCES;
- rte_atomic_store_explicit(&run_once, 0, rte_memory_order_relaxed);
- return -1;
+ goto err_out;
}
}
@@ -613,7 +608,7 @@ rte_eal_init(int argc, char **argv)
if (rte_eal_memzone_init() < 0) {
rte_eal_init_alert("Cannot init memzone");
rte_errno = ENODEV;
- return -1;
+ goto err_out;
}
rte_mcfg_mem_read_lock();
@@ -622,14 +617,14 @@ rte_eal_init(int argc, char **argv)
rte_mcfg_mem_read_unlock();
rte_eal_init_alert("Cannot init memory");
rte_errno = ENOMEM;
- return -1;
+ goto err_out;
}
if (rte_eal_malloc_heap_init() < 0) {
rte_mcfg_mem_read_unlock();
rte_eal_init_alert("Cannot init malloc heap");
rte_errno = ENODEV;
- return -1;
+ goto err_out;
}
rte_mcfg_mem_read_unlock();
@@ -637,19 +632,19 @@ rte_eal_init(int argc, char **argv)
if (rte_eal_malloc_heap_populate() < 0) {
rte_eal_init_alert("Cannot init malloc heap");
rte_errno = ENODEV;
- return -1;
+ goto err_out;
}
if (rte_eal_tailqs_init() < 0) {
rte_eal_init_alert("Cannot init tail queues for objects");
rte_errno = EFAULT;
- return -1;
+ goto err_out;
}
if (rte_eal_timer_init() < 0) {
rte_eal_init_alert("Cannot init HPET or TSC timers");
rte_errno = ENOTSUP;
- return -1;
+ goto err_out;
}
eal_rand_init();
@@ -660,7 +655,7 @@ rte_eal_init(int argc, char **argv)
&lcore_config[config->main_lcore].cpuset) != 0) {
rte_eal_init_alert("Cannot set affinity");
rte_errno = EINVAL;
- return -1;
+ goto err_out;
}
__rte_thread_init(config->main_lcore,
&lcore_config[config->main_lcore].cpuset);
@@ -713,14 +708,14 @@ rte_eal_init(int argc, char **argv)
if (ret) {
rte_eal_init_alert("rte_service_init() failed");
rte_errno = -ret;
- return -1;
+ goto err_out;
}
/* Probe all the buses and devices/drivers on them */
if (rte_bus_probe()) {
rte_eal_init_alert("Cannot probe devices");
rte_errno = ENOTSUP;
- return -1;
+ goto err_out;
}
/* initialize default service/lcore mappings and start running. Ignore
@@ -729,7 +724,7 @@ rte_eal_init(int argc, char **argv)
ret = rte_service_start_with_defaults();
if (ret < 0 && ret != -ENOTSUP) {
rte_errno = -ret;
- return -1;
+ goto err_out;
}
/*
@@ -744,18 +739,22 @@ rte_eal_init(int argc, char **argv)
*/
if (!internal_conf->no_shconf && eal_clean_runtime_dir() < 0) {
rte_eal_init_alert("Cannot clear runtime directory");
- return -1;
+ goto err_out;
}
if (rte_eal_process_type() == RTE_PROC_PRIMARY && !internal_conf->no_telemetry) {
if (rte_telemetry_init(rte_eal_get_runtime_dir(),
rte_version(),
&internal_conf->ctrl_cpuset) != 0)
- return -1;
+ goto err_out;
}
eal_mcfg_complete();
return fctret;
+err_out:
+ rte_atomic_store_explicit(&run_once, 0, rte_memory_order_relaxed);
+ eal_clean_saved_args();
+ return -1;
}
RTE_EXPORT_SYMBOL(rte_eal_cleanup)
diff --git a/lib/eal/linux/eal.c b/lib/eal/linux/eal.c
index f59cb43b0e..210d461497 100644
--- a/lib/eal/linux/eal.c
+++ b/lib/eal/linux/eal.c
@@ -579,6 +579,14 @@ rte_eal_init(int argc, char **argv)
struct internal_config *internal_conf =
eal_get_internal_configuration();
+ /* first check if we have been run before */
+ if (!rte_atomic_compare_exchange_strong_explicit(&run_once, &has_run, 1,
+ rte_memory_order_relaxed, rte_memory_order_relaxed)) {
+ rte_eal_init_alert("already called initialization.");
+ rte_errno = EALREADY;
+ return -1;
+ }
+
/* clone argv to report out later in telemetry */
eal_save_args(argc, argv);
@@ -586,14 +594,14 @@ rte_eal_init(int argc, char **argv)
if (fctret < 0) {
rte_eal_init_alert("Invalid command line arguments.");
rte_errno = EINVAL;
- return -1;
+ goto err_out;
}
/* setup log as early as possible */
if (eal_parse_log_options() < 0) {
rte_eal_init_alert("invalid log arguments.");
rte_errno = EINVAL;
- return -1;
+ goto err_out;
}
eal_log_init(program_invocation_short_name);
@@ -602,21 +610,14 @@ rte_eal_init(int argc, char **argv)
if (!rte_cpu_is_supported()) {
rte_eal_init_alert("unsupported cpu type.");
rte_errno = ENOTSUP;
- return -1;
+ goto err_out;
}
/* verify if DPDK supported on architecture MMU */
if (!eal_mmu_supported()) {
rte_eal_init_alert("unsupported MMU type.");
rte_errno = ENOTSUP;
- return -1;
- }
-
- if (!rte_atomic_compare_exchange_strong_explicit(&run_once, &has_run, 1,
- rte_memory_order_relaxed, rte_memory_order_relaxed)) {
- rte_eal_init_alert("already called initialization.");
- rte_errno = EALREADY;
- return -1;
+ goto err_out;
}
eal_reset_internal_config(internal_conf);
@@ -624,49 +625,46 @@ rte_eal_init(int argc, char **argv)
if (rte_eal_cpu_init() < 0) {
rte_eal_init_alert("Cannot detect lcores.");
rte_errno = ENOTSUP;
- return -1;
+ goto err_out;
}
if (eal_parse_args() < 0) {
- rte_eal_init_alert("Invalid command line arguments.");
+ rte_eal_init_alert("Error parsing command line arguments.");
rte_errno = EINVAL;
- rte_atomic_store_explicit(&run_once, 0, rte_memory_order_relaxed);
- return -1;
+ goto err_out;
}
if (eal_plugins_init() < 0) {
rte_eal_init_alert("Cannot init plugins");
rte_errno = EINVAL;
- rte_atomic_store_explicit(&run_once, 0, rte_memory_order_relaxed);
- return -1;
+ goto err_out;
}
if (eal_trace_init() < 0) {
rte_eal_init_alert("Cannot init trace");
rte_errno = EFAULT;
- return -1;
+ goto err_out;
}
if (eal_option_device_parse()) {
rte_errno = ENODEV;
- rte_atomic_store_explicit(&run_once, 0, rte_memory_order_relaxed);
- return -1;
+ goto err_out;
}
if (rte_config_init() < 0) {
rte_eal_init_alert("Cannot init config");
- return -1;
+ goto err_out;
}
if (rte_eal_intr_init() < 0) {
rte_eal_init_alert("Cannot init interrupt-handling thread");
- return -1;
+ goto err_out;
}
if (rte_eal_alarm_init() < 0) {
rte_eal_init_alert("Cannot init alarm");
/* rte_eal_alarm_init sets rte_errno on failure. */
- return -1;
+ goto err_out;
}
/* Put mp channel init before bus scan so that we can init the vdev
@@ -676,15 +674,14 @@ rte_eal_init(int argc, char **argv)
rte_eal_init_alert("failed to init mp channel");
if (rte_eal_process_type() == RTE_PROC_PRIMARY) {
rte_errno = EFAULT;
- return -1;
+ goto err_out;
}
}
if (rte_bus_scan()) {
rte_eal_init_alert("Cannot scan the buses for devices");
rte_errno = ENODEV;
- rte_atomic_store_explicit(&run_once, 0, rte_memory_order_relaxed);
- return -1;
+ goto err_out;
}
phys_addrs = rte_eal_using_phys_addrs() != 0;
@@ -727,13 +724,13 @@ rte_eal_init(int argc, char **argv)
if (rte_eal_iova_mode() == RTE_IOVA_PA && !phys_addrs) {
rte_eal_init_alert("Cannot use IOVA as 'PA' since physical addresses are not available");
rte_errno = EINVAL;
- return -1;
+ goto err_out;
}
if (rte_eal_iova_mode() == RTE_IOVA_PA && !RTE_IOVA_IN_MBUF) {
rte_eal_init_alert("Cannot use IOVA as 'PA' as it is disabled during build");
rte_errno = EINVAL;
- return -1;
+ goto err_out;
}
EAL_LOG(INFO, "Selected IOVA mode '%s'",
@@ -747,8 +744,7 @@ rte_eal_init(int argc, char **argv)
if (ret < 0) {
rte_eal_init_alert("Cannot get hugepage information.");
rte_errno = EACCES;
- rte_atomic_store_explicit(&run_once, 0, rte_memory_order_relaxed);
- return -1;
+ goto err_out;
}
}
@@ -772,8 +768,7 @@ rte_eal_init(int argc, char **argv)
if (rte_vfio_enable("vfio")) {
rte_eal_init_alert("Cannot init VFIO");
rte_errno = EAGAIN;
- rte_atomic_store_explicit(&run_once, 0, rte_memory_order_relaxed);
- return -1;
+ goto err_out;
}
#endif
/* in secondary processes, memory init may allocate additional fbarrays
@@ -783,7 +778,7 @@ rte_eal_init(int argc, char **argv)
if (rte_eal_memzone_init() < 0) {
rte_eal_init_alert("Cannot init memzone");
rte_errno = ENODEV;
- return -1;
+ goto err_out;
}
rte_mcfg_mem_read_lock();
@@ -792,7 +787,7 @@ rte_eal_init(int argc, char **argv)
rte_mcfg_mem_read_unlock();
rte_eal_init_alert("Cannot init memory");
rte_errno = ENOMEM;
- return -1;
+ goto err_out;
}
/* the directories are locked during eal_hugepage_info_init */
@@ -802,7 +797,7 @@ rte_eal_init(int argc, char **argv)
rte_mcfg_mem_read_unlock();
rte_eal_init_alert("Cannot init malloc heap");
rte_errno = ENODEV;
- return -1;
+ goto err_out;
}
rte_mcfg_mem_read_unlock();
@@ -810,25 +805,25 @@ rte_eal_init(int argc, char **argv)
if (rte_eal_malloc_heap_populate() < 0) {
rte_eal_init_alert("Cannot init malloc heap");
rte_errno = ENODEV;
- return -1;
+ goto err_out;
}
/* register multi-process action callbacks for hotplug after memory init */
if (eal_mp_dev_hotplug_init() < 0) {
rte_eal_init_alert("failed to register mp callback for hotplug");
- return -1;
+ goto err_out;
}
if (rte_eal_tailqs_init() < 0) {
rte_eal_init_alert("Cannot init tail queues for objects");
rte_errno = EFAULT;
- return -1;
+ goto err_out;
}
if (rte_eal_timer_init() < 0) {
rte_eal_init_alert("Cannot init HPET or TSC timers");
rte_errno = ENOTSUP;
- return -1;
+ goto err_out;
}
eal_rand_init();
@@ -839,7 +834,7 @@ rte_eal_init(int argc, char **argv)
&lcore_config[config->main_lcore].cpuset) != 0) {
rte_eal_init_alert("Cannot set affinity");
rte_errno = EINVAL;
- return -1;
+ goto err_out;
}
__rte_thread_init(config->main_lcore,
&lcore_config[config->main_lcore].cpuset);
@@ -890,14 +885,14 @@ rte_eal_init(int argc, char **argv)
if (ret) {
rte_eal_init_alert("rte_service_init() failed");
rte_errno = -ret;
- return -1;
+ goto err_out;
}
/* Probe all the buses and devices/drivers on them */
if (rte_bus_probe()) {
rte_eal_init_alert("Cannot probe devices");
rte_errno = ENOTSUP;
- return -1;
+ goto err_out;
}
/* initialize default service/lcore mappings and start running. Ignore
@@ -906,7 +901,7 @@ rte_eal_init(int argc, char **argv)
ret = rte_service_start_with_defaults();
if (ret < 0 && ret != -ENOTSUP) {
rte_errno = -ret;
- return -1;
+ goto err_out;
}
/*
@@ -921,18 +916,23 @@ rte_eal_init(int argc, char **argv)
*/
if (!internal_conf->no_shconf && eal_clean_runtime_dir() < 0) {
rte_eal_init_alert("Cannot clear runtime directory");
- return -1;
+ goto err_out;
}
if (rte_eal_process_type() == RTE_PROC_PRIMARY && !internal_conf->no_telemetry) {
if (rte_telemetry_init(rte_eal_get_runtime_dir(),
rte_version(),
&internal_conf->ctrl_cpuset) != 0)
- return -1;
+ goto err_out;
}
eal_mcfg_complete();
return fctret;
+
+err_out:
+ rte_atomic_store_explicit(&run_once, 0, rte_memory_order_relaxed);
+ eal_clean_saved_args();
+ return -1;
}
static int
diff --git a/lib/eal/windows/eal.c b/lib/eal/windows/eal.c
index 14547d5ac9..cd9a72a0fc 100644
--- a/lib/eal/windows/eal.c
+++ b/lib/eal/windows/eal.c
@@ -174,14 +174,14 @@ rte_eal_init(int argc, char **argv)
if (fctret < 0) {
rte_eal_init_alert("Invalid command line arguments.");
rte_errno = EINVAL;
- return -1;
+ goto err_out;
}
/* setup log as early as possible */
if (eal_parse_log_options() < 0) {
rte_eal_init_alert("invalid log arguments.");
rte_errno = EINVAL;
- return -1;
+ goto err_out;
}
eal_log_init(NULL);
@@ -189,31 +189,31 @@ rte_eal_init(int argc, char **argv)
if (eal_create_cpu_map() < 0) {
rte_eal_init_alert("Cannot discover CPU and NUMA.");
/* rte_errno is set */
- return -1;
+ goto err_out;
}
/* verify if DPDK supported on architecture MMU */
if (!eal_mmu_supported()) {
rte_eal_init_alert("Unsupported MMU type.");
rte_errno = ENOTSUP;
- return -1;
+ goto err_out;
}
if (rte_eal_cpu_init() < 0) {
rte_eal_init_alert("Cannot detect lcores.");
rte_errno = ENOTSUP;
- return -1;
+ goto err_out;
}
if (eal_parse_args() < 0) {
rte_eal_init_alert("Invalid command line arguments.");
rte_errno = EINVAL;
- return -1;
+ goto err_out;
}
if (eal_option_device_parse()) {
rte_errno = ENODEV;
- return -1;
+ goto err_out;
}
/* Prevent creation of shared memory files. */
@@ -227,7 +227,7 @@ rte_eal_init(int argc, char **argv)
if (!internal_conf->no_hugetlbfs && (eal_hugepage_info_init() < 0)) {
rte_eal_init_alert("Cannot get hugepage information");
rte_errno = EACCES;
- return -1;
+ goto err_out;
}
if (internal_conf->memory == 0 && !internal_conf->force_numa) {
@@ -237,26 +237,26 @@ rte_eal_init(int argc, char **argv)
if (rte_eal_intr_init() < 0) {
rte_eal_init_alert("Cannot init interrupt-handling thread");
- return -1;
+ goto err_out;
}
if (rte_eal_timer_init() < 0) {
rte_eal_init_alert("Cannot init TSC timer");
rte_errno = EFAULT;
- return -1;
+ goto err_out;
}
bscan = rte_bus_scan();
if (bscan < 0) {
rte_eal_init_alert("Cannot scan the buses");
rte_errno = ENODEV;
- return -1;
+ goto err_out;
}
if (eal_mem_win32api_init() < 0) {
rte_eal_init_alert("Cannot access Win32 memory management");
rte_errno = ENOTSUP;
- return -1;
+ goto err_out;
}
has_phys_addr = true;
@@ -289,13 +289,13 @@ rte_eal_init(int argc, char **argv)
if (iova_mode == RTE_IOVA_PA && !has_phys_addr) {
rte_eal_init_alert("Cannot use IOVA as 'PA' since physical addresses are not available");
rte_errno = EINVAL;
- return -1;
+ goto err_out;
}
if (iova_mode == RTE_IOVA_PA && !RTE_IOVA_IN_MBUF) {
rte_eal_init_alert("Cannot use IOVA as 'PA' as it is disabled during build");
rte_errno = EINVAL;
- return -1;
+ goto err_out;
}
EAL_LOG(DEBUG, "Selected IOVA mode '%s'",
@@ -305,7 +305,7 @@ rte_eal_init(int argc, char **argv)
if (rte_eal_memzone_init() < 0) {
rte_eal_init_alert("Cannot init memzone");
rte_errno = ENODEV;
- return -1;
+ goto err_out;
}
rte_mcfg_mem_read_lock();
@@ -314,14 +314,14 @@ rte_eal_init(int argc, char **argv)
rte_mcfg_mem_read_unlock();
rte_eal_init_alert("Cannot init memory");
rte_errno = ENOMEM;
- return -1;
+ goto err_out;
}
if (rte_eal_malloc_heap_init() < 0) {
rte_mcfg_mem_read_unlock();
rte_eal_init_alert("Cannot init malloc heap");
rte_errno = ENODEV;
- return -1;
+ goto err_out;
}
rte_mcfg_mem_read_unlock();
@@ -329,13 +329,13 @@ rte_eal_init(int argc, char **argv)
if (rte_eal_malloc_heap_populate() < 0) {
rte_eal_init_alert("Cannot init malloc heap");
rte_errno = ENODEV;
- return -1;
+ goto err_out;
}
if (rte_eal_tailqs_init() < 0) {
rte_eal_init_alert("Cannot init tail queues for objects");
rte_errno = EFAULT;
- return -1;
+ goto err_out;
}
eal_rand_init();
@@ -344,7 +344,7 @@ rte_eal_init(int argc, char **argv)
&lcore_config[config->main_lcore].cpuset) != 0) {
rte_eal_init_alert("Cannot set affinity");
rte_errno = EINVAL;
- return -1;
+ goto err_out;
}
__rte_thread_init(config->main_lcore,
&lcore_config[config->main_lcore].cpuset);
@@ -390,13 +390,13 @@ rte_eal_init(int argc, char **argv)
if (ret) {
rte_eal_init_alert("rte_service_init() failed");
rte_errno = -ret;
- return -1;
+ goto err_out;
}
if (rte_bus_probe()) {
rte_eal_init_alert("Cannot probe devices");
rte_errno = ENOTSUP;
- return -1;
+ goto err_out;
}
/*
@@ -409,6 +409,9 @@ rte_eal_init(int argc, char **argv)
eal_mcfg_complete();
return fctret;
+err_out:
+ eal_clean_saved_args();
+ return -1;
}
/* Don't use MinGW asprintf() to have identical code with all toolchains. */
--
2.48.1
next prev parent reply other threads:[~2025-07-18 14:34 UTC|newest]
Thread overview: 32+ messages / expand[flat|nested] mbox.gz Atom feed top
2025-05-20 16:40 [RFC PATCH 0/7] rework EAL argument parsing in DPDK Bruce Richardson
2025-05-20 16:40 ` [RFC PATCH 1/7] eal: add long options for each short option Bruce Richardson
2025-05-20 16:40 ` [RFC PATCH 2/7] argparse: add support for string and boolean args Bruce Richardson
2025-05-20 16:40 ` [RFC PATCH 3/7] argparse: make argparse EAL-args compatible Bruce Richardson
2025-05-22 10:44 ` Bruce Richardson
2025-05-20 16:40 ` [RFC PATCH 4/7] eal: define the EAL parameters in argparse format Bruce Richardson
2025-05-20 16:40 ` [RFC PATCH 5/7] eal: gather EAL args before processing Bruce Richardson
2025-05-20 16:40 ` [RFC PATCH 6/7] eal: combine parameter validation checks Bruce Richardson
2025-05-20 16:40 ` [RFC PATCH 7/7] eal: simplify handling of conflicting cmdline options Bruce Richardson
2025-07-08 17:20 ` [RFC PATCH v2 0/5] rework EAL argument parsing in DPDK Bruce Richardson
2025-07-08 17:20 ` [RFC PATCH v2 1/5] eal: add long options for each short option Bruce Richardson
2025-07-08 17:20 ` [RFC PATCH v2 2/5] eal: define the EAL parameters in argparse format Bruce Richardson
2025-07-08 17:20 ` [RFC PATCH v2 3/5] eal: gather EAL args before processing Bruce Richardson
2025-07-08 17:20 ` [RFC PATCH v2 4/5] eal: combine parameter validation checks Bruce Richardson
2025-07-08 17:20 ` [RFC PATCH v2 5/5] eal: simplify handling of conflicting cmdline options Bruce Richardson
2025-07-08 18:41 ` [RFC PATCH v2 0/5] rework EAL argument parsing in DPDK Stephen Hemminger
2025-07-09 7:50 ` Bruce Richardson
2025-07-09 12:30 ` David Marchand
2025-07-09 12:54 ` Bruce Richardson
2025-07-17 10:41 ` David Marchand
2025-07-17 10:54 ` Bruce Richardson
2025-07-18 14:33 ` [PATCH v3 0/9] rework EAL argument parsing Bruce Richardson
2025-07-18 14:33 ` [PATCH v3 1/9] build: add define for the OS environment name Bruce Richardson
2025-07-18 14:33 ` [PATCH v3 2/9] argparse: export function to print help text for object Bruce Richardson
2025-07-18 14:33 ` [PATCH v3 3/9] argparse: allow user-override of help printing Bruce Richardson
2025-07-18 14:33 ` [PATCH v3 4/9] eal: add long options for each short option Bruce Richardson
2025-07-18 14:33 ` [PATCH v3 5/9] eal: define the EAL parameters in argparse format Bruce Richardson
2025-07-18 14:33 ` [PATCH v3 6/9] eal: gather EAL args before processing Bruce Richardson
2025-07-18 14:33 ` Bruce Richardson [this message]
2025-07-18 14:33 ` [PATCH v3 8/9] eal: combine parameter validation checks Bruce Richardson
2025-07-18 14:33 ` [PATCH v3 9/9] eal: simplify handling of conflicting cmdline options Bruce Richardson
2025-07-18 14:41 ` [PATCH v3 0/9] rework EAL argument parsing Bruce Richardson
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20250718143356.1578988-8-bruce.richardson@intel.com \
--to=bruce.richardson@intel.com \
--cc=david.marchand@redhat.com \
--cc=dev@dpdk.org \
--cc=dmitry.kozliuk@gmail.com \
--cc=roretzla@linux.microsoft.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).