eal: add function to release internal resources
authorHarry van Haaren <harry.van.haaren@intel.com>
Mon, 29 Jan 2018 16:37:30 +0000 (16:37 +0000)
committerThomas Monjalon <thomas@monjalon.net>
Mon, 29 Jan 2018 19:33:53 +0000 (20:33 +0100)
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.haaren@intel.com>
Acked-by: Vipin Varghese <vipin.varghese@intel.com>
doc/guides/prog_guide/env_abstraction_layer.rst
doc/guides/rel_notes/release_18_02.rst
lib/librte_eal/bsdapp/eal/eal.c
lib/librte_eal/bsdapp/eal/eal_debug.c
lib/librte_eal/common/include/rte_eal.h
lib/librte_eal/linuxapp/eal/eal.c
lib/librte_eal/linuxapp/eal/eal_debug.c
lib/librte_eal/rte_eal_version.map

index 34d871c..04bd776 100644 (file)
@@ -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
 ~~~~~~~~~~~~~~~~~~~~~
 
index 00b3224..8c3968e 100644 (file)
@@ -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
index c602d02..3ca7c7d 100644 (file)
@@ -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)
index b0ae2b7..5d92500 100644 (file)
@@ -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,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();
index 2aba2c8..8b36fea 100644 (file)
@@ -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
  *
index e8c7100..5f9032c 100644 (file)
@@ -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)
index b0ae2b7..5d92500 100644 (file)
@@ -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,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();
index ce299d3..93f6c13 100644 (file)
@@ -214,6 +214,7 @@ DPDK_18.02 {
 EXPERIMENTAL {
        global:
 
+       rte_eal_cleanup;
        rte_eal_devargs_insert;
        rte_eal_devargs_parse;
        rte_eal_devargs_remove;