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

Reply via email to