From aec9c13c5257f0dae350152fa0444634fe35859e Mon Sep 17 00:00:00 2001 From: Harry van Haaren Date: Mon, 29 Jan 2018 16:37:30 +0000 Subject: [PATCH] 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 Acked-by: Vipin Varghese --- doc/guides/prog_guide/env_abstraction_layer.rst | 8 ++++++++ doc/guides/rel_notes/release_18_02.rst | 9 +++++++++ lib/librte_eal/bsdapp/eal/eal.c | 6 ++++++ lib/librte_eal/bsdapp/eal/eal_debug.c | 4 ++++ lib/librte_eal/common/include/rte_eal.h | 16 ++++++++++++++++ lib/librte_eal/linuxapp/eal/eal.c | 6 ++++++ lib/librte_eal/linuxapp/eal/eal_debug.c | 4 ++++ lib/librte_eal/rte_eal_version.map | 1 + 8 files changed, 54 insertions(+) diff --git a/doc/guides/prog_guide/env_abstraction_layer.rst b/doc/guides/prog_guide/env_abstraction_layer.rst index 34d871c9a3..04bd776100 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 00b3224f35..8c3968e8fa 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/eal.c b/lib/librte_eal/bsdapp/eal/eal.c index c602d02a21..3ca7c7d7a9 100644 --- a/lib/librte_eal/bsdapp/eal/eal.c +++ b/lib/librte_eal/bsdapp/eal/eal.c @@ -709,6 +709,12 @@ rte_eal_init(int argc, char **argv) return fctret; } +int rte_eal_cleanup(void) +{ + rte_service_finalize(); + return 0; +} + /* get core role */ enum rte_lcore_role_t rte_eal_lcore_role(unsigned lcore_id) diff --git a/lib/librte_eal/bsdapp/eal/eal_debug.c b/lib/librte_eal/bsdapp/eal/eal_debug.c index b0ae2b7f2d..5d92500bf5 100644 --- a/lib/librte_eal/bsdapp/eal/eal_debug.c +++ b/lib/librte_eal/bsdapp/eal/eal_debug.c @@ -14,6 +14,7 @@ #include #include #include +#include #define BACKTRACE_SIZE 256 @@ -79,6 +80,9 @@ rte_exit(int exit_code, const char *format, ...) va_end(ap); #ifndef RTE_EAL_ALWAYS_PANIC_ON_ERROR + if (rte_eal_cleanup() != 0) + RTE_LOG(CRIT, EAL, + "EAL could not release all resources\n"); exit(exit_code); #else rte_dump_stack(); diff --git a/lib/librte_eal/common/include/rte_eal.h b/lib/librte_eal/common/include/rte_eal.h index 2aba2c8bd4..8b36feabcb 100644 --- a/lib/librte_eal/common/include/rte_eal.h +++ b/lib/librte_eal/common/include/rte_eal.h @@ -169,6 +169,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 * diff --git a/lib/librte_eal/linuxapp/eal/eal.c b/lib/librte_eal/linuxapp/eal/eal.c index e8c7100a35..5f9032c575 100644 --- a/lib/librte_eal/linuxapp/eal/eal.c +++ b/lib/librte_eal/linuxapp/eal/eal.c @@ -974,6 +974,12 @@ rte_eal_init(int argc, char **argv) return fctret; } +int rte_eal_cleanup(void) +{ + rte_service_finalize(); + return 0; +} + /* get core role */ enum rte_lcore_role_t rte_eal_lcore_role(unsigned lcore_id) diff --git a/lib/librte_eal/linuxapp/eal/eal_debug.c b/lib/librte_eal/linuxapp/eal/eal_debug.c index b0ae2b7f2d..5d92500bf5 100644 --- a/lib/librte_eal/linuxapp/eal/eal_debug.c +++ b/lib/librte_eal/linuxapp/eal/eal_debug.c @@ -14,6 +14,7 @@ #include #include #include +#include #define BACKTRACE_SIZE 256 @@ -79,6 +80,9 @@ rte_exit(int exit_code, const char *format, ...) va_end(ap); #ifndef RTE_EAL_ALWAYS_PANIC_ON_ERROR + if (rte_eal_cleanup() != 0) + RTE_LOG(CRIT, EAL, + "EAL could not release all resources\n"); 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 ce299d3a82..93f6c13508 100644 --- a/lib/librte_eal/rte_eal_version.map +++ b/lib/librte_eal/rte_eal_version.map @@ -214,6 +214,7 @@ DPDK_18.02 { EXPERIMENTAL { global: + rte_eal_cleanup; rte_eal_devargs_insert; rte_eal_devargs_parse; rte_eal_devargs_remove; -- 2.20.1