From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mga14.intel.com (mga14.intel.com [192.55.52.115]) by dpdk.org (Postfix) with ESMTP id B9BA71B1E1; Fri, 26 Jan 2018 16:14:16 +0100 (CET) X-Amp-Result: SKIPPED(no attachment in message) X-Amp-File-Uploaded: False Received: from orsmga008.jf.intel.com ([10.7.209.65]) by fmsmga103.fm.intel.com with ESMTP/TLS/DHE-RSA-AES256-GCM-SHA384; 26 Jan 2018 07:14:15 -0800 X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.46,417,1511856000"; d="scan'208";a="13276565" Received: from unknown (HELO localhost.localdomain) ([10.224.122.203]) by orsmga008.jf.intel.com with ESMTP; 26 Jan 2018 07:14:13 -0800 From: Vipin Varghese To: harry.van.haaren@intel.com, dev@dpdk.org Cc: stable@dpdk.org, Vipin Varghese Date: Sat, 27 Jan 2018 02:25:36 +0530 Message-Id: <1517000136-24802-1-git-send-email-vipin.varghese@intel.com> X-Mailer: git-send-email 1.9.1 In-Reply-To: <1515694853-7949-1-git-send-email-vipin.varghese@intel.com> References: <1515694853-7949-1-git-send-email-vipin.varghese@intel.com> Subject: [dpdk-stable] [PATCH v3] service: fix memory leak by rte_service_init 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: Fri, 26 Jan 2018 15:14:17 -0000 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: harry.van.haaren@intel.com Signed-off-by: Vipin Varghese --- V2 Changes: - renamed routine to finalize (Bruce) - improved code flow (Harry) V3 Changes: - fix order of function in map file --- 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 02b1512..5e3e3a6 100644 --- a/lib/librte_eal/common/include/rte_service.h +++ b/lib/librte_eal/common/include/rte_service.h @@ -429,6 +429,17 @@ int32_t rte_service_attr_get(uint32_t id, uint32_t attr_id, */ int32_t rte_service_attr_reset_all(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 b40c3d9..bcd644a 100644 --- a/lib/librte_eal/common/rte_service.c +++ b/lib/librte_eal/common/rte_service.c @@ -114,6 +114,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 7088b72..1a8b1b5 100644 --- a/lib/librte_eal/rte_eal_version.map +++ b/lib/librte_eal/rte_eal_version.map @@ -223,6 +223,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; -- 1.9.1