thread: Move get/put calls into .c file

This will make it much easier to mock this library for use in unit
tests.

Change-Id: I7dc835865f75f9e29e8b709a634d30053ada2055
Signed-off-by: Ben Walker <benjamin.walker@intel.com>
Reviewed-on: https://review.spdk.io/gerrit/c/spdk/spdk/+/16296
Tested-by: SPDK CI Jenkins <sys_sgci@intel.com>
Reviewed-by: Aleksey Marchuk <alexeymar@nvidia.com>
Community-CI: Mellanox Build Bot
Reviewed-by: Jim Harris <james.r.harris@intel.com>
This commit is contained in:
Ben Walker 2023-01-17 08:34:36 +00:00 committed by Jim Harris
parent a9bcb7f261
commit 9bc7d6b34f
3 changed files with 66 additions and 59 deletions

View File

@ -1103,39 +1103,8 @@ void spdk_iobuf_entry_abort(struct spdk_iobuf_channel *ch, struct spdk_iobuf_ent
*
* \return pointer to a buffer or NULL if no buffers are currently available.
*/
static inline void *
spdk_iobuf_get(struct spdk_iobuf_channel *ch, uint64_t len,
struct spdk_iobuf_entry *entry, spdk_iobuf_get_cb cb_fn)
{
struct spdk_iobuf_pool *pool;
void *buf;
assert(spdk_io_channel_get_thread(ch->parent) == spdk_get_thread());
if (len <= ch->small.bufsize) {
pool = &ch->small;
} else {
assert(len <= ch->large.bufsize);
pool = &ch->large;
}
buf = (void *)STAILQ_FIRST(&pool->cache);
if (buf) {
STAILQ_REMOVE_HEAD(&pool->cache, stailq);
assert(pool->cache_count > 0);
pool->cache_count--;
} else {
buf = spdk_mempool_get(pool->pool);
if (!buf) {
STAILQ_INSERT_TAIL(pool->queue, entry, stailq);
entry->module = ch->module;
entry->cb_fn = cb_fn;
return NULL;
}
}
return (char *)buf;
}
void *spdk_iobuf_get(struct spdk_iobuf_channel *ch, uint64_t len, struct spdk_iobuf_entry *entry,
spdk_iobuf_get_cb cb_fn);
/**
* Release a buffer back to the iobuf pool. If there are outstanding requests waiting for a buffer,
@ -1145,32 +1114,7 @@ spdk_iobuf_get(struct spdk_iobuf_channel *ch, uint64_t len,
* \param buf Buffer to release
* \param len Length of the buffer (must be the exact same value as specified in `spdk_iobuf_get()`).
*/
static inline void
spdk_iobuf_put(struct spdk_iobuf_channel *ch, void *buf, uint64_t len)
{
struct spdk_iobuf_entry *entry;
struct spdk_iobuf_pool *pool;
assert(spdk_io_channel_get_thread(ch->parent) == spdk_get_thread());
if (len <= ch->small.bufsize) {
pool = &ch->small;
} else {
pool = &ch->large;
}
if (STAILQ_EMPTY(pool->queue)) {
if (pool->cache_count < pool->cache_size) {
STAILQ_INSERT_HEAD(&pool->cache, (struct spdk_iobuf_buffer *)buf, stailq);
pool->cache_count++;
} else {
spdk_mempool_put(pool->pool, buf);
}
} else {
entry = STAILQ_FIRST(pool->queue);
STAILQ_REMOVE_HEAD(pool->queue, stailq);
entry->cb_fn(entry, buf);
}
}
void spdk_iobuf_put(struct spdk_iobuf_channel *ch, void *buf, uint64_t len);
#ifdef __cplusplus
}

View File

@ -347,3 +347,64 @@ spdk_iobuf_entry_abort(struct spdk_iobuf_channel *ch, struct spdk_iobuf_entry *e
STAILQ_REMOVE(pool->queue, entry, spdk_iobuf_entry, stailq);
}
void *
spdk_iobuf_get(struct spdk_iobuf_channel *ch, uint64_t len,
struct spdk_iobuf_entry *entry, spdk_iobuf_get_cb cb_fn)
{
struct spdk_iobuf_pool *pool;
void *buf;
assert(spdk_io_channel_get_thread(ch->parent) == spdk_get_thread());
if (len <= ch->small.bufsize) {
pool = &ch->small;
} else {
assert(len <= ch->large.bufsize);
pool = &ch->large;
}
buf = (void *)STAILQ_FIRST(&pool->cache);
if (buf) {
STAILQ_REMOVE_HEAD(&pool->cache, stailq);
assert(pool->cache_count > 0);
pool->cache_count--;
} else {
buf = spdk_mempool_get(pool->pool);
if (!buf) {
STAILQ_INSERT_TAIL(pool->queue, entry, stailq);
entry->module = ch->module;
entry->cb_fn = cb_fn;
return NULL;
}
}
return (char *)buf;
}
void
spdk_iobuf_put(struct spdk_iobuf_channel *ch, void *buf, uint64_t len)
{
struct spdk_iobuf_entry *entry;
struct spdk_iobuf_pool *pool;
assert(spdk_io_channel_get_thread(ch->parent) == spdk_get_thread());
if (len <= ch->small.bufsize) {
pool = &ch->small;
} else {
pool = &ch->large;
}
if (STAILQ_EMPTY(pool->queue)) {
if (pool->cache_count < pool->cache_size) {
STAILQ_INSERT_HEAD(&pool->cache, (struct spdk_iobuf_buffer *)buf, stailq);
pool->cache_count++;
} else {
spdk_mempool_put(pool->pool, buf);
}
} else {
entry = STAILQ_FIRST(pool->queue);
STAILQ_REMOVE_HEAD(pool->queue, stailq);
entry->cb_fn(entry, buf);
}
}

View File

@ -72,6 +72,8 @@
spdk_iobuf_register_module;
spdk_iobuf_for_each_entry;
spdk_iobuf_entry_abort;
spdk_iobuf_get;
spdk_iobuf_put;
# internal functions in spdk_internal/thread.h
spdk_poller_get_name;