As user initiates pool params with its own memory reserving and un-reserving functions, pool will be created on its own memory, or on odp share memory as before.
Signed-off-by: Zaibo Xu <xuza...@huawei.com> --- include/odp/api/pool.h | 12 ++++++++++++ platform/linux-generic/odp_pool.c | 34 +++++++++++++++++++++++++--------- 2 files changed, 37 insertions(+), 9 deletions(-) diff --git a/include/odp/api/pool.h b/include/odp/api/pool.h index 2e79a55..fce0592 100644 --- a/include/odp/api/pool.h +++ b/include/odp/api/pool.h @@ -40,6 +40,12 @@ extern "C" { /** Maximum queue name length in chars */ #define ODP_POOL_NAME_LEN 32 +/** For user's memory reserve function */ +typedef void* (*odp_usr_resv_mem_t)(uint32_t len); + +/** For user's memory un-reserve function */ +typedef int (*odp_usr_unresv_mem_t)(void *addr); + /** * Pool parameters * Used to communicate pool creation options. @@ -48,6 +54,12 @@ typedef struct odp_pool_param_t { /** Pool type */ int type; + /** Odp pool can be created on user's own memory. + there are memory reserve and un-reserve + functions of user. */ + odp_usr_resv_mem_t resv_mem_fn; + odp_usr_unresv_mem_t unresv_mem_fn; + union { struct { /** Number of buffers in the pool */ diff --git a/platform/linux-generic/odp_pool.c b/platform/linux-generic/odp_pool.c index 84d35bf..eb8b153 100644 --- a/platform/linux-generic/odp_pool.c +++ b/platform/linux-generic/odp_pool.c @@ -295,15 +295,27 @@ odp_pool_t odp_pool_create(const char *name, odp_pool_param_t *params) mdata_size + udata_size); - shm = odp_shm_reserve(pool->s.name, - pool->s.pool_size, - ODP_PAGE_SIZE, 0); - if (shm == ODP_SHM_INVALID) { - POOL_UNLOCK(&pool->s.lock); - return ODP_POOL_INVALID; + if (pool->s.params.resv_mem_fn != NULL) { + void *addr = pool->s.params.resv_mem_fn( + (uint32_t)pool->s.pool_size); + + if (addr == NULL) { + POOL_UNLOCK(&pool->s.lock); + return ODP_POOL_INVALID; + } + pool->s.pool_base_addr = (uint8_t *)addr; + pool->s.pool_shm = (odp_shm_t)!ODP_SHM_INVALID; + } else { + shm = odp_shm_reserve(pool->s.name, + pool->s.pool_size, + ODP_PAGE_SIZE, 0); + if (shm == ODP_SHM_INVALID) { + POOL_UNLOCK(&pool->s.lock); + return ODP_POOL_INVALID; + } + pool->s.pool_base_addr = odp_shm_addr(shm); + pool->s.pool_shm = shm; } - pool->s.pool_base_addr = odp_shm_addr(shm); - pool->s.pool_shm = shm; /* Now safe to unlock since pool entry has been allocated */ POOL_UNLOCK(&pool->s.lock); @@ -473,7 +485,11 @@ int odp_pool_destroy(odp_pool_t pool_hdl) return -1; } - odp_shm_free(pool->s.pool_shm); + if (pool->s.params.unresv_mem_fn != NULL) + pool->s.params.unresv_mem_fn((void *)pool->s.pool_base_addr); + else + odp_shm_free(pool->s.pool_shm); + pool->s.pool_shm = ODP_SHM_INVALID; POOL_UNLOCK(&pool->s.lock); -- 1.9.1 _______________________________________________ lng-odp mailing list lng-odp@lists.linaro.org https://lists.linaro.org/mailman/listinfo/lng-odp