diff --git a/include/spdk/env.h b/include/spdk/env.h index 41af9306c..208b5a573 100644 --- a/include/spdk/env.h +++ b/include/spdk/env.h @@ -154,6 +154,28 @@ struct spdk_mempool; struct spdk_mempool *spdk_mempool_create(const char *name, size_t count, size_t ele_size, size_t cache_size, int socket_id); +/** + * An object callback function for mempool. + * + * Used by spdk_mempool_create_ctor + */ +typedef void (spdk_mempool_obj_cb_t)(struct spdk_mempool *mp, + void *opaque, void *obj, unsigned obj_idx); + +/** + * Create a thread-safe memory pool with user provided initialization function and argument. + * + * \param cache_size How many elements may be cached in per-core caches. Use + * SPDK_MEMPOOL_DEFAULT_CACHE_SIZE for a reasonable default, or 0 for no + * per-core cache. + * \param socket_id Socket ID to allocate memory on, or SPDK_ENV_SOCKET_ID_ANY for any socket. + * \param obj_init User provided object calll back initialization function. + * \paam obj_init_arg User provided callback initialization function argument. + */ +struct spdk_mempool *spdk_mempool_create_ctor(const char *name, size_t count, + size_t ele_size, size_t cache_size, int socket_id, + spdk_mempool_obj_cb_t *obj_init, void *obj_init_arg); + /** * Get the name of a mempool */ diff --git a/lib/env_dpdk/env.c b/lib/env_dpdk/env.c index 36ab8ae1c..1088cb707 100644 --- a/lib/env_dpdk/env.c +++ b/lib/env_dpdk/env.c @@ -150,8 +150,9 @@ spdk_memzone_dump(FILE *f) } struct spdk_mempool * -spdk_mempool_create(const char *name, size_t count, - size_t ele_size, size_t cache_size, int socket_id) +spdk_mempool_create_ctor(const char *name, size_t count, + size_t ele_size, size_t cache_size, int socket_id, + spdk_mempool_obj_cb_t *obj_init, void *obj_init_arg) { struct rte_mempool *mp; size_t tmp; @@ -171,12 +172,21 @@ spdk_mempool_create(const char *name, size_t count, } mp = rte_mempool_create(name, count, ele_size, cache_size, - 0, NULL, NULL, NULL, NULL, + 0, NULL, NULL, (rte_mempool_obj_cb_t *)obj_init, obj_init_arg, socket_id, 0); return (struct spdk_mempool *)mp; } + +struct spdk_mempool * +spdk_mempool_create(const char *name, size_t count, + size_t ele_size, size_t cache_size, int socket_id) +{ + return spdk_mempool_create_ctor(name, count, ele_size, cache_size, socket_id, + NULL, NULL); +} + char * spdk_mempool_get_name(struct spdk_mempool *mp) {