metrics: add function to deinitialise library
authorHarman Kalra <hkalra@marvell.com>
Thu, 11 Jul 2019 09:26:05 +0000 (09:26 +0000)
committerThomas Monjalon <thomas@monjalon.net>
Tue, 16 Jul 2019 10:45:30 +0000 (12:45 +0200)
Once the library usage is over, it must be deinitialized which
will free the shared memory reserved during initialization.

Observed an issue while running 'metrics_autotest' continuously
without quiting. For the first run 'metrics_autotest' passes
all test cases but second run onwards first test case fails
because metrics library is already initialized during first run.

Signed-off-by: Harman Kalra <hkalra@marvell.com>
Acked-by: Remy Horton <remy.horton@intel.com>
Acked-by: Reshma Pattan <reshma.pattan@intel.com>
doc/guides/prog_guide/metrics_lib.rst
lib/librte_metrics/rte_metrics.c
lib/librte_metrics/rte_metrics.h
lib/librte_metrics/rte_metrics_version.map

index 89bc7d6..eca855d 100644 (file)
@@ -154,6 +154,20 @@ print out all metrics for a given port:
     }
 
 
+Deinitialising the library
+--------------------------
+
+Once the library usage is done, it must be deinitialized by calling
+``rte_metrics_deinit()`` which will free the shared memory reserved
+during initialization.
+
+.. code-block:: c
+
+    err = rte_metrics_deinit(void);
+
+If the return value is negative, it means deinitialization failed.
+This function **must** be called from a primary process.
+
 Bit-rate statistics library
 ---------------------------
 
index 99a96b6..df5e32c 100644 (file)
@@ -76,6 +76,26 @@ rte_metrics_init(int socket_id)
        rte_spinlock_init(&stats->lock);
 }
 
+int
+rte_metrics_deinit(void)
+{
+       struct rte_metrics_data_s *stats;
+       const struct rte_memzone *memzone;
+
+       if (rte_eal_process_type() != RTE_PROC_PRIMARY)
+               return -EINVAL;
+
+       memzone = rte_memzone_lookup(RTE_METRICS_MEMZONE_NAME);
+       if (memzone == NULL)
+               return -EIO;
+
+       stats = memzone->addr;
+       memset(stats, 0, sizeof(struct rte_metrics_data_s));
+
+       return rte_memzone_free(memzone);
+
+}
+
 int
 rte_metrics_reg_name(const char *name)
 {
index 67a60fa..77bffe0 100644 (file)
@@ -24,6 +24,7 @@
 #define _RTE_METRICS_H_
 
 #include <stdint.h>
+#include <rte_compat.h>
 
 #ifdef __cplusplus
 extern "C" {
@@ -80,6 +81,23 @@ struct rte_metric_value {
  */
 void rte_metrics_init(int socket_id);
 
+/**
+ * @warning
+ * @b EXPERIMENTAL: this API may change without prior notice
+ *
+ * Deinitialize metric module. This function must be called from
+ * a primary process after all the metrics usage is over, to
+ *  release the shared memory.
+ *
+ * @return
+ *  -EINVAL - invalid parameter.
+ *  -EIO: Error, unable to access metrics shared memory
+ *    (rte_metrics_init() not called)
+ *  0 - success
+ */
+__rte_experimental
+int rte_metrics_deinit(void);
+
 /**
  * Register a metric, making it available as a reporting parameter.
  *
index 4c5234c..6ac99a4 100644 (file)
@@ -11,3 +11,9 @@ DPDK_17.05 {
 
        local: *;
 };
+
+EXPERIMENTAL {
+       global:
+
+       rte_metrics_deinit;
+};