diff mbox series

[2.0,v1,2/3] linux-gen: pktio: add pktio ops_data pool

Message ID 1510822807-12483-3-git-send-email-odpbot@yandex.ru
State New
Headers show
Series [2.0,v1,1/3] frameworks: modular: add static walk through function template | expand

Commit Message

Github ODP bot Nov. 16, 2017, 9 a.m. UTC
From: Bogdan Pricope <bogdan.pricope@linaro.org>


Add memory pool for pktio entry private data.

Signed-off-by: Bogdan Pricope <bogdan.pricope@linaro.org>

---
/** Email created from pull request 297 (bogdanPricope:2_0_ops_alloc_pr)
 ** https://github.com/Linaro/odp/pull/297
 ** Patch: https://github.com/Linaro/odp/pull/297.patch
 ** Base sha: 6cd43041e55bd73a02ca202f835e590b3ad5c354
 ** Merge commit sha: 9a2195f21322cf4bcf5f0b7b2fb827746597d8a1
 **/
 .../include/odp_pktio_ops_subsystem.h              | 31 ++++++++++++++
 platform/linux-generic/pktio/subsystem.c           | 50 +++++++++++++++++++++-
 2 files changed, 79 insertions(+), 2 deletions(-)
diff mbox series

Patch

diff --git a/platform/linux-generic/include/odp_pktio_ops_subsystem.h b/platform/linux-generic/include/odp_pktio_ops_subsystem.h
index cb107fed2..110c113b4 100644
--- a/platform/linux-generic/include/odp_pktio_ops_subsystem.h
+++ b/platform/linux-generic/include/odp_pktio_ops_subsystem.h
@@ -16,6 +16,7 @@  extern "C" {
 
 #include <odp_module.h>
 #include <odp/api/packet_io.h>
+#include <odp/drv/shm.h>
 
 /* ODP packet IO operations subsystem declaration */
 ODP_SUBSYSTEM_DECLARE(pktio_ops);
@@ -88,10 +89,40 @@  typedef ODP_MODULE_CLASS(pktio_ops) {
 /* Maximum size of pktio specific ops data.*/
 #define ODP_PKTIO_ODPS_DATA_MAX_SIZE 80000
 
+/* Pktio ops data pool */
+#define ODP_PKTIO_OPS_DATA_POOL_SIZE 160000
+#define ODP_PKTIO_OPS_DATA_POOL_NAME "ODP_PKTIO_OPS_DATA"
+
 /* Extract pktio ops data from pktio entry structure */
 #define odp_ops_data(_p, _mod) \
 	((pktio_ops_ ## _mod ## _data_t *)(uintptr_t)_p->s.ops_data)
 
+#define odp_ops_data_alloc(_p, _mod)					\
+({ \
+	odpdrv_shm_pool_t _pool = ODPDRV_SHM_POOL_INVALID;		\
+	uint64_t _size = sizeof(pktio_ops_ ## _mod ## _data_t);		\
+									\
+	_p->s.ops_data = NULL;			\
+	_pool = odpdrv_shm_pool_lookup(ODP_PKTIO_OPS_DATA_POOL_NAME);	\
+	if (_pool != ODPDRV_SHM_POOL_INVALID)				\
+		_p->s.ops_data = odpdrv_shm_pool_alloc(_pool, _size);	\
+									\
+	((pktio_ops_ ## _mod ## _data_t *)_p->s.ops_data);		\
+})
+
+#define odp_ops_data_free(_p)						\
+({									\
+	int _result = -1;						\
+	odpdrv_shm_pool_t _pool = ODPDRV_SHM_POOL_INVALID;		\
+									\
+	_pool = odpdrv_shm_pool_lookup(ODP_PKTIO_OPS_DATA_POOL_NAME);	\
+	if (_pool != ODPDRV_SHM_POOL_INVALID) {				\
+		odpdrv_shm_pool_free(_pool, _p->s.ops_data);		\
+		_result = 0;						\
+	}								\
+	_result;							\
+})
+
 #ifdef __cplusplus
 }
 #endif
diff --git a/platform/linux-generic/pktio/subsystem.c b/platform/linux-generic/pktio/subsystem.c
index a3b36c144..abcec7253 100644
--- a/platform/linux-generic/pktio/subsystem.c
+++ b/platform/linux-generic/pktio/subsystem.c
@@ -15,9 +15,55 @@ 
 ODP_SUBSYSTEM_DEFINE(pktio_ops, "packet IO operations", SUBSYSTEM_VERSION);
 
 /* Instantiate init and term functions */
-ODP_SUBSYSTEM_FOREACH_TEMPLATE(pktio_ops, init_global, ODP_ERR)
+SUBSYSTEM_FOREACH_TEMPLATE(pktio_ops, init_global, ODP_ERR)
+SUBSYSTEM_FOREACH_TEMPLATE(pktio_ops, term_global, ODP_ERR)
 ODP_SUBSYSTEM_FOREACH_TEMPLATE(pktio_ops, init_local, ODP_ERR)
-ODP_SUBSYSTEM_FOREACH_TEMPLATE(pktio_ops, term_global, ODP_ABORT)
+
+int odp_pktio_ops_init_global(bool continue_on_errors)
+{
+	odpdrv_shm_pool_t pktio_ops_pool = ODPDRV_SHM_POOL_INVALID;
+	odpdrv_shm_pool_param_t pktio_ops_param;
+
+	pktio_ops_param.pool_size = ODP_PKTIO_OPS_DATA_POOL_SIZE;
+	pktio_ops_param.min_alloc = 1;
+	pktio_ops_param.max_alloc = ODP_PKTIO_OPS_DATA_POOL_SIZE;
+
+	pktio_ops_pool = odpdrv_shm_pool_create(ODP_PKTIO_OPS_DATA_POOL_NAME,
+						&pktio_ops_param);
+	if (pktio_ops_pool == ODPDRV_SHM_POOL_INVALID) {
+		ODP_ERR("error to pool_create pktio_ops pool\n");
+		if (!continue_on_errors)
+			return -1;
+	}
+
+	return pktio_ops_init_global(continue_on_errors);
+}
+
+int odp_pktio_ops_term_global(bool continue_on_errors)
+{
+	int result = 0;
+	odpdrv_shm_pool_t pktio_ops_pool = ODPDRV_SHM_POOL_INVALID;
+
+	result = pktio_ops_term_global(continue_on_errors);
+	if (result) {
+		ODP_ERR("error to pktio_ops_term_global\n");
+		if (!continue_on_errors)
+			return -1;
+	}
+
+	pktio_ops_pool = odpdrv_shm_pool_lookup(ODP_PKTIO_OPS_DATA_POOL_NAME);
+	if (pktio_ops_pool != ODPDRV_SHM_POOL_INVALID) {
+		if (odpdrv_shm_pool_destroy(pktio_ops_pool)) {
+			ODP_ERR("error pool_destroy pktio_ops pool\n");
+			result = -1;
+		}
+	} else {
+		ODP_ERR("error pool_lookup pktio_ops pool\n");
+		result = -1;
+	}
+
+	return result;
+}
 
 /* Temporary variable to enable link modules,
  * will remove in Makefile scheme changes.