DPDK libraries should never call rte_exit on failure, so change the function return type of rte_metrics_init to "int" to allow returning an error code to the application rather than exiting the whole app on init failure.
Signed-off-by: Bruce Richardson <bruce.richard...@intel.com> --- doc/guides/rel_notes/deprecation.rst | 3 --- lib/metrics/rte_metrics.c | 12 +++++++----- lib/metrics/rte_metrics.h | 8 +++++++- 3 files changed, 14 insertions(+), 9 deletions(-) diff --git a/doc/guides/rel_notes/deprecation.rst b/doc/guides/rel_notes/deprecation.rst index db261d33f7..688b8c2606 100644 --- a/doc/guides/rel_notes/deprecation.rst +++ b/doc/guides/rel_notes/deprecation.rst @@ -175,8 +175,5 @@ Deprecation Notices ``rte_event_vector::elem_offset`` gives the number of valid elements left to process from the ``rte_event_vector::elem_offset``. -* metrics: The function ``rte_metrics_init`` will have a non-void return - in order to notify errors instead of calling ``rte_exit``. - * raw/dpaa2_cmdif: The ``dpaa2_cmdif`` rawdev driver will be deprecated in DPDK 22.11, as it is no longer in use, no active user known. diff --git a/lib/metrics/rte_metrics.c b/lib/metrics/rte_metrics.c index 6adcda501c..0ccdbabc04 100644 --- a/lib/metrics/rte_metrics.c +++ b/lib/metrics/rte_metrics.c @@ -5,6 +5,7 @@ #include <stdlib.h> #include <string.h> +#include <rte_errno.h> #include <rte_common.h> #include <rte_string_fns.h> #include <rte_metrics.h> @@ -54,28 +55,29 @@ struct rte_metrics_data_s { rte_spinlock_t lock; }; -void +int rte_metrics_init(int socket_id) { struct rte_metrics_data_s *stats; const struct rte_memzone *memzone; if (metrics_initialized) - return; + return 0; if (rte_eal_process_type() != RTE_PROC_PRIMARY) - return; + return -E_RTE_SECONDARY; memzone = rte_memzone_lookup(RTE_METRICS_MEMZONE_NAME); if (memzone != NULL) - return; + return -EEXIST; memzone = rte_memzone_reserve(RTE_METRICS_MEMZONE_NAME, sizeof(struct rte_metrics_data_s), socket_id, 0); if (memzone == NULL) - rte_exit(EXIT_FAILURE, "Unable to allocate stats memzone\n"); + return -ENOMEM; stats = memzone->addr; memset(stats, 0, sizeof(struct rte_metrics_data_s)); rte_spinlock_init(&stats->lock); metrics_initialized = 1; + return 0; } int diff --git a/lib/metrics/rte_metrics.h b/lib/metrics/rte_metrics.h index c2815a252c..5c33af9999 100644 --- a/lib/metrics/rte_metrics.h +++ b/lib/metrics/rte_metrics.h @@ -79,8 +79,14 @@ struct rte_metric_value { * * @param socket_id * Socket to use for shared memory allocation. + * @return + * 0 on success + * Negative error code (from rte_errno.h) on error: + * -EEXIST - a memzone for metrics already exists but metrics is not initialized + * -ENOMEM - cannot allocate metrics memzone + * -E_RTE_SECONDARY - function called from secondary process */ -void rte_metrics_init(int socket_id); +int rte_metrics_init(int socket_id); /** * Deinitialize metric module. This function must be called from -- 2.34.1