> -----Original Message----- > From: Van Haaren, Harry > Sent: Monday, January 29, 2018 5:38 PM > To: dev@dpdk.org > Cc: Van Haaren, Harry <harry.van.haa...@intel.com>; tho...@monjalon.net; > Varghese, Vipin <vipin.vargh...@intel.com> > Subject: [PATCH v3 2/4] eal: add function to release internal resources > > This commit adds a new function rte_eal_cleanup(). > The function serves as a hook to allow DPDK to release internal resources > (e.g.: > hugepage allocations). > > This function allows DPDK to become more like an ordinary library, where the > library context itself can be initialized and cleaned up by the application. > > The rte_exit() and rte_panic() functions must be considered, particularly if > they > should call rte_eal_cleanup() to release any resources or not. This patch adds > the cleanup to rte_exit(), but does not clean up on rte_panic(). The reason > to not > clean up on panicing is that the developer may wish to inspect the exact > internal > state of EAL and hugepages. > > Signed-off-by: Harry van Haaren <harry.van.haa...@intel.com> > > --- > > v3: > - Rename function to cleanup (Thomas) > > v2: > - Add eal_common.c file commit (Vipin) > > Cc: tho...@monjalon.net > Cc: vipin.vargh...@intel.com > --- > doc/guides/prog_guide/env_abstraction_layer.rst | 8 ++++++++ > doc/guides/rel_notes/release_18_02.rst | 9 +++++++++ > lib/librte_eal/bsdapp/eal/Makefile | 1 + > lib/librte_eal/bsdapp/eal/eal_debug.c | 5 +++++ > lib/librte_eal/common/eal_common.c | 11 +++++++++++ > lib/librte_eal/common/include/rte_eal.h | 16 ++++++++++++++++ > lib/librte_eal/linuxapp/eal/Makefile | 1 + > lib/librte_eal/linuxapp/eal/eal_debug.c | 5 +++++ > lib/librte_eal/rte_eal_version.map | 1 + > 9 files changed, 57 insertions(+) > create mode 100644 lib/librte_eal/common/eal_common.c > > diff --git a/doc/guides/prog_guide/env_abstraction_layer.rst > b/doc/guides/prog_guide/env_abstraction_layer.rst > index 34d871c..04bd776 100644 > --- a/doc/guides/prog_guide/env_abstraction_layer.rst > +++ b/doc/guides/prog_guide/env_abstraction_layer.rst > @@ -99,6 +99,14 @@ It consist of calls to the pthread library (more > specifically, > pthread_self(), p > The creation and initialization functions for these objects are not > multi-thread > safe. > However, once initialized, the objects themselves can safely be used in > multiple threads simultaneously. > > +Shutdown and Cleanup > +~~~~~~~~~~~~~~~~~~~~ > + > +During the initialization of EAL resources such as hugepage backed > +memory can be allocated by core components. The memory allocated > +during ``rte_eal_init()`` can be released by calling the > +``rte_eal_cleanup()`` function. Refer to the API documentation for details. > + > Multi-process Support > ~~~~~~~~~~~~~~~~~~~~~ > > diff --git a/doc/guides/rel_notes/release_18_02.rst > b/doc/guides/rel_notes/release_18_02.rst > index 00b3224..8c3968e 100644 > --- a/doc/guides/rel_notes/release_18_02.rst > +++ b/doc/guides/rel_notes/release_18_02.rst > @@ -41,6 +41,15 @@ New Features > Also, make sure to start the actual text at the margin. > ========================================================= > > +* **Add function to allow releasing internal EAL resources on exit** > + > + During ``rte_eal_init()`` EAL allocates memory from hugepages to > + enable its core libraries to perform their tasks. The > + ``rte_eal_cleanup()`` function releases these resources, ensuring > + that no hugepage memory is leaked. It is expected that all DPDK > + applications call ``rte_eal_cleanup()`` before exiting. Not calling > + this function could result in leaking hugepages, leading to failure during > initialization of secondary processes. > + > * **Added the ixgbe ethernet driver to support RSS with flow API.** > > Rte_flow actually defined to include RSS, but till now, RSS is out of diff > --git > a/lib/librte_eal/bsdapp/eal/Makefile b/lib/librte_eal/bsdapp/eal/Makefile > index c694076..7480f98 100644 > --- a/lib/librte_eal/bsdapp/eal/Makefile > +++ b/lib/librte_eal/bsdapp/eal/Makefile > @@ -34,6 +34,7 @@ SRCS-$(CONFIG_RTE_EXEC_ENV_BSDAPP) += > eal_interrupts.c > SRCS-$(CONFIG_RTE_EXEC_ENV_BSDAPP) += eal_alarm.c > > # from common dir > +SRCS-$(CONFIG_RTE_EXEC_ENV_BSDAPP) += eal_common.c > SRCS-$(CONFIG_RTE_EXEC_ENV_BSDAPP) += eal_common_lcore.c > SRCS-$(CONFIG_RTE_EXEC_ENV_BSDAPP) += eal_common_timer.c > SRCS-$(CONFIG_RTE_EXEC_ENV_BSDAPP) += eal_common_memzone.c diff -- > git a/lib/librte_eal/bsdapp/eal/eal_debug.c > b/lib/librte_eal/bsdapp/eal/eal_debug.c > index b0ae2b7..f66e504 100644 > --- a/lib/librte_eal/bsdapp/eal/eal_debug.c > +++ b/lib/librte_eal/bsdapp/eal/eal_debug.c > @@ -14,6 +14,7 @@ > #include <rte_log.h> > #include <rte_debug.h> > #include <rte_common.h> > +#include <rte_eal.h> > > #define BACKTRACE_SIZE 256 > > @@ -79,6 +80,10 @@ rte_exit(int exit_code, const char *format, ...) > va_end(ap); > > #ifndef RTE_EAL_ALWAYS_PANIC_ON_ERROR > + int ret = rte_eal_cleanup(); > + if (ret) > + RTE_LOG(CRIT, EAL, > + "EAL could not release all resources, code %d\n", ret); > exit(exit_code); > #else > rte_dump_stack(); > diff --git a/lib/librte_eal/common/eal_common.c > b/lib/librte_eal/common/eal_common.c > new file mode 100644 > index 0000000..52771e7 > --- /dev/null > +++ b/lib/librte_eal/common/eal_common.c > @@ -0,0 +1,11 @@ > +/* SPDX-License-Identifier: BSD-3-Clause > + * Copyright(c) 2018 Intel Corporation > + */ > + > +#include <rte_service_component.h> > + > +int rte_eal_cleanup(void) > +{ > + rte_service_finalize(); > + return 0; > +} > diff --git a/lib/librte_eal/common/include/rte_eal.h > b/lib/librte_eal/common/include/rte_eal.h > index 2aba2c8..8b36fea 100644 > --- a/lib/librte_eal/common/include/rte_eal.h > +++ b/lib/librte_eal/common/include/rte_eal.h > @@ -170,6 +170,22 @@ int rte_eal_iopl_init(void); int rte_eal_init(int argc, > char **argv); > > /** > + * @warning > + * @b EXPERIMENTAL: this API may change without prior notice > + * > + * Clean up the Environment Abstraction Layer (EAL) > + * > + * This function must be called to release any internal resources that > +EAL has > + * allocated during rte_eal_init(). After this call, no DPDK function > +calls may > + * be made. It is expected that common usage of this function is to > +call it > + * just before terminating the process. > + * > + * @return 0 Successfully released all internal EAL resources > + * @return -EFAULT There was an error in releasing all resources. > + */ > +int rte_eal_cleanup(void); > + > +/** > * Check if a primary process is currently alive > * > * This function returns true when a primary process is currently diff --git > a/lib/librte_eal/linuxapp/eal/Makefile b/lib/librte_eal/linuxapp/eal/Makefile > index 7bf278f..ad20f2f 100644 > --- a/lib/librte_eal/linuxapp/eal/Makefile > +++ b/lib/librte_eal/linuxapp/eal/Makefile > @@ -41,6 +41,7 @@ SRCS-$(CONFIG_RTE_EXEC_ENV_LINUXAPP) += > eal_interrupts.c > SRCS-$(CONFIG_RTE_EXEC_ENV_LINUXAPP) += eal_alarm.c > > # from common dir > +SRCS-$(CONFIG_RTE_EXEC_ENV_LINUXAPP) += eal_common.c > SRCS-$(CONFIG_RTE_EXEC_ENV_LINUXAPP) += eal_common_lcore.c > SRCS-$(CONFIG_RTE_EXEC_ENV_LINUXAPP) += eal_common_timer.c > SRCS-$(CONFIG_RTE_EXEC_ENV_LINUXAPP) += eal_common_memzone.c diff - > -git a/lib/librte_eal/linuxapp/eal/eal_debug.c > b/lib/librte_eal/linuxapp/eal/eal_debug.c > index b0ae2b7..f66e504 100644 > --- a/lib/librte_eal/linuxapp/eal/eal_debug.c > +++ b/lib/librte_eal/linuxapp/eal/eal_debug.c > @@ -14,6 +14,7 @@ > #include <rte_log.h> > #include <rte_debug.h> > #include <rte_common.h> > +#include <rte_eal.h> > > #define BACKTRACE_SIZE 256 > > @@ -79,6 +80,10 @@ rte_exit(int exit_code, const char *format, ...) > va_end(ap); > > #ifndef RTE_EAL_ALWAYS_PANIC_ON_ERROR > + int ret = rte_eal_cleanup(); > + if (ret) > + RTE_LOG(CRIT, EAL, > + "EAL could not release all resources, code %d\n", ret); > exit(exit_code); > #else > rte_dump_stack(); > diff --git a/lib/librte_eal/rte_eal_version.map > b/lib/librte_eal/rte_eal_version.map > index 1a8b1b5..8dd4abf 100644 > --- a/lib/librte_eal/rte_eal_version.map > +++ b/lib/librte_eal/rte_eal_version.map > @@ -215,6 +215,7 @@ EXPERIMENTAL { > rte_eal_devargs_insert; > rte_eal_devargs_parse; > rte_eal_devargs_remove; > + rte_eal_cleanup; > rte_eal_hotplug_add; > rte_eal_hotplug_remove; > rte_service_attr_get; > -- > 2.7.4
Thanks, Checked for Linux application. Acked-by: Vipin Varghese <vipin.vargh...@intel.com>