From: Mattias Rönnblom <mattias.ronnb...@ericsson.com> Calling rte_exit() from a worker lcore thread causes a deadlock in rte_service_finalize().
This patch makes rte_service_finalize() deadlock-free by avoiding the need to synchronize with service lcore threads, which in turn is achieved by moving service and per-lcore state from the heap to being statically allocated. The BSS segment increases with ~156 kB (on x86_64 with default RTE_MAX_LCORE and RTE_SERVICE_NUM_MAX). According to the service perf autotest, this change also results in a slight reduction of service framework overhead. Fixes: 33666b448f15 ("service: fix crash on exit") Cc: sta...@dpdk.org Signed-off-by: Mattias Rönnblom <mattias.ronnb...@ericsson.com> Acked-by: Tyler Retzlaff <roret...@linux.microsoft.com> --- Changes since v1: - rebased, --- lib/eal/common/rte_service.c | 28 ++-------------------------- 1 file changed, 2 insertions(+), 26 deletions(-) diff --git a/lib/eal/common/rte_service.c b/lib/eal/common/rte_service.c index a38c594ce4..5b6805b8d8 100644 --- a/lib/eal/common/rte_service.c +++ b/lib/eal/common/rte_service.c @@ -15,7 +15,6 @@ #include <rte_common.h> #include <rte_cycles.h> #include <rte_atomic.h> -#include <rte_malloc.h> #include <rte_spinlock.h> #include <rte_trace_point.h> @@ -76,8 +75,8 @@ struct __rte_cache_aligned core_state { }; static uint32_t rte_service_count; -static struct rte_service_spec_impl *rte_services; -static struct core_state *lcore_states; +static struct rte_service_spec_impl rte_services[RTE_SERVICE_NUM_MAX]; +static struct core_state lcore_states[RTE_MAX_LCORE]; static uint32_t rte_service_library_initialized; int32_t @@ -95,21 +94,6 @@ rte_service_init(void) return -EALREADY; } - rte_services = rte_calloc("rte_services", RTE_SERVICE_NUM_MAX, - sizeof(struct rte_service_spec_impl), - RTE_CACHE_LINE_SIZE); - if (!rte_services) { - EAL_LOG(ERR, "error allocating rte services array"); - goto fail_mem; - } - - lcore_states = rte_calloc("rte_service_core_states", RTE_MAX_LCORE, - sizeof(struct core_state), RTE_CACHE_LINE_SIZE); - if (!lcore_states) { - EAL_LOG(ERR, "error allocating core states array"); - goto fail_mem; - } - int i; struct rte_config *cfg = rte_eal_get_configuration(); for (i = 0; i < RTE_MAX_LCORE; i++) { @@ -122,10 +106,6 @@ rte_service_init(void) rte_service_library_initialized = 1; return 0; -fail_mem: - rte_free(rte_services); - rte_free(lcore_states); - return -ENOMEM; } void @@ -135,10 +115,6 @@ rte_service_finalize(void) return; rte_service_lcore_reset_all(); - rte_eal_mp_wait_lcore(); - - rte_free(rte_services); - rte_free(lcore_states); rte_service_library_initialized = 0; } -- 2.46.2