metrics: add function to deinitialise library

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>
This commit is contained in:
Harman Kalra 2019-07-11 09:26:05 +00:00 committed by Thomas Monjalon
parent c199ca1576
commit 44dc7c0a26
4 changed files with 58 additions and 0 deletions

View 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
---------------------------

View 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)
{

View 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.
*

View File

@ -11,3 +11,9 @@ DPDK_17.05 {
local: *;
};
EXPERIMENTAL {
global:
rte_metrics_deinit;
};