From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mga02.intel.com (mga02.intel.com [134.134.136.20]) by dpdk.org (Postfix) with ESMTP id BCB4D1B2BA for ; Tue, 13 Feb 2018 17:05:53 +0100 (CET) X-Amp-Result: SKIPPED(no attachment in message) X-Amp-File-Uploaded: False Received: from fmsmga002.fm.intel.com ([10.253.24.26]) by orsmga101.jf.intel.com with ESMTP/TLS/DHE-RSA-AES256-GCM-SHA384; 13 Feb 2018 08:05:52 -0800 X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.46,507,1511856000"; d="scan'208";a="19670384" Received: from silpixa00398672.ir.intel.com ([10.237.223.111]) by fmsmga002.fm.intel.com with ESMTP; 13 Feb 2018 08:05:51 -0800 From: Harry van Haaren To: stable@dpdk.org Cc: yliu@fridaylinux.org, harry.van.haaren@intel.com, vipin.varghese@intel.com Date: Tue, 13 Feb 2018 16:05:41 +0000 Message-Id: <1518537944-125482-2-git-send-email-harry.van.haaren@intel.com> X-Mailer: git-send-email 2.7.4 In-Reply-To: <1518537944-125482-1-git-send-email-harry.van.haaren@intel.com> References: <1518537944-125482-1-git-send-email-harry.van.haaren@intel.com> Subject: [dpdk-stable] [PATCH 1/4] service: fix memory leak with new function X-BeenThere: stable@dpdk.org X-Mailman-Version: 2.1.15 Precedence: list List-Id: patches for DPDK stable branches List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Tue, 13 Feb 2018 16:05:54 -0000 From: Vipin Varghese Backported fix from upstream commit: da23f0a service: fix memory leak with new function The rte_service_finalize routine checks if service is initialized or not. If yes; releases internal memory for services and lcore states are freed. This routine is to be invoked at end of application termination. Fixes: 21698354c832 ("service: introduce service cores concept") Cc: stable@dpdk.org Signed-off-by: Vipin Varghese --- As I only backported, I didn't add signoff - its Vipin's code. If that's not correct, please advise and I can update it. --- lib/librte_eal/common/include/rte_service.h | 11 +++++++++++ lib/librte_eal/common/rte_service.c | 14 ++++++++++++++ lib/librte_eal/rte_eal_version.map | 1 + 3 files changed, 26 insertions(+) diff --git a/lib/librte_eal/common/include/rte_service.h b/lib/librte_eal/common/include/rte_service.h index 80b90fa..b4cdf40 100644 --- a/lib/librte_eal/common/include/rte_service.h +++ b/lib/librte_eal/common/include/rte_service.h @@ -423,6 +423,17 @@ int32_t rte_service_lcore_count_services(uint32_t lcore); */ int32_t rte_service_dump(FILE *f, uint32_t id); +/** + * @warning + * @b EXPERIMENTAL: this API may change without prior notice + * + * Free up the memory that has been initialized. This routine + * is to be invoked prior to process termination. + * + * @retval None + */ +void rte_service_finalize(void); + #ifdef __cplusplus } #endif diff --git a/lib/librte_eal/common/rte_service.c b/lib/librte_eal/common/rte_service.c index 1f92294..0f101f6 100644 --- a/lib/librte_eal/common/rte_service.c +++ b/lib/librte_eal/common/rte_service.c @@ -143,6 +143,20 @@ int32_t rte_service_init(void) return -ENOMEM; } +void rte_service_finalize(void) +{ + if (!rte_service_library_initialized) + return; + + if (rte_services) + rte_free(rte_services); + + if (lcore_states) + rte_free(lcore_states); + + rte_service_library_initialized = 0; +} + /* returns 1 if service is registered and has not been unregistered * Returns 0 if service never registered, or has been unregistered */ diff --git a/lib/librte_eal/rte_eal_version.map b/lib/librte_eal/rte_eal_version.map index f4f46c1..edc8e9e 100644 --- a/lib/librte_eal/rte_eal_version.map +++ b/lib/librte_eal/rte_eal_version.map @@ -212,6 +212,7 @@ EXPERIMENTAL { rte_service_component_unregister; rte_service_component_runstate_set; rte_service_dump; + rte_service_finalize; rte_service_get_by_id; rte_service_get_by_name; rte_service_get_count; -- 2.7.4