lib/thread: iobuf get/put functions will not add offset
When a buffer is get, it does not need to reserve the space for tailq header. Signed-off-by: MengjinWu <mengjin.wu@intel.com> Change-Id: I0aa2d77739fbb86a6e2df1c00a772aff1cb7c6e4 Reviewed-on: https://review.spdk.io/gerrit/c/spdk/spdk/+/16181 Tested-by: SPDK CI Jenkins <sys_sgci@intel.com> Reviewed-by: Konrad Sztyber <konrad.sztyber@intel.com> Reviewed-by: Ben Walker <benjamin.walker@intel.com>
This commit is contained in:
parent
6b97cccf34
commit
eb7506a1b4
@ -975,15 +975,11 @@ struct spdk_iobuf_entry {
|
||||
STAILQ_ENTRY(spdk_iobuf_entry) stailq;
|
||||
};
|
||||
|
||||
#define SPDK_IOBUF_DATA_OFFSET SPDK_CACHE_LINE_SIZE
|
||||
|
||||
struct spdk_iobuf_buffer {
|
||||
STAILQ_ENTRY(spdk_iobuf_buffer) stailq;
|
||||
};
|
||||
|
||||
SPDK_STATIC_ASSERT(sizeof(struct spdk_iobuf_buffer) <= SPDK_IOBUF_DATA_OFFSET,
|
||||
"Invalid data offset");
|
||||
|
||||
typedef STAILQ_HEAD(, spdk_iobuf_entry) spdk_iobuf_entry_stailq_t;
|
||||
typedef STAILQ_HEAD(, spdk_iobuf_buffer) spdk_iobuf_buffer_stailq_t;
|
||||
|
||||
@ -1123,7 +1119,7 @@ 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;
|
||||
struct spdk_iobuf_buffer *buf;
|
||||
void *buf;
|
||||
|
||||
assert(spdk_io_channel_get_thread(ch->parent) == spdk_get_thread());
|
||||
if (len <= ch->small.bufsize) {
|
||||
@ -1133,13 +1129,13 @@ spdk_iobuf_get(struct spdk_iobuf_channel *ch, uint64_t len,
|
||||
pool = &ch->large;
|
||||
}
|
||||
|
||||
buf = STAILQ_FIRST(&pool->cache);
|
||||
buf = (void *)STAILQ_FIRST(&pool->cache);
|
||||
if (buf) {
|
||||
STAILQ_REMOVE_HEAD(&pool->cache, stailq);
|
||||
assert(pool->cache_count > 0);
|
||||
pool->cache_count--;
|
||||
} else {
|
||||
buf = (struct spdk_iobuf_buffer *)spdk_mempool_get(pool->pool);
|
||||
buf = spdk_mempool_get(pool->pool);
|
||||
if (!buf) {
|
||||
STAILQ_INSERT_TAIL(pool->queue, entry, stailq);
|
||||
entry->module = ch->module;
|
||||
@ -1149,7 +1145,7 @@ spdk_iobuf_get(struct spdk_iobuf_channel *ch, uint64_t len,
|
||||
}
|
||||
}
|
||||
|
||||
return (char *)buf + SPDK_IOBUF_DATA_OFFSET;
|
||||
return (char *)buf;
|
||||
}
|
||||
|
||||
/**
|
||||
@ -1164,7 +1160,6 @@ static inline void
|
||||
spdk_iobuf_put(struct spdk_iobuf_channel *ch, void *buf, uint64_t len)
|
||||
{
|
||||
struct spdk_iobuf_entry *entry;
|
||||
struct spdk_iobuf_buffer *iobuf_buf;
|
||||
struct spdk_iobuf_pool *pool;
|
||||
|
||||
assert(spdk_io_channel_get_thread(ch->parent) == spdk_get_thread());
|
||||
@ -1175,13 +1170,11 @@ spdk_iobuf_put(struct spdk_iobuf_channel *ch, void *buf, uint64_t len)
|
||||
}
|
||||
|
||||
if (STAILQ_EMPTY(pool->queue)) {
|
||||
iobuf_buf = (struct spdk_iobuf_buffer *)((char *)buf - SPDK_IOBUF_DATA_OFFSET);
|
||||
|
||||
if (pool->cache_count < pool->cache_size) {
|
||||
STAILQ_INSERT_HEAD(&pool->cache, iobuf_buf, stailq);
|
||||
STAILQ_INSERT_HEAD(&pool->cache, (struct spdk_iobuf_buffer *)buf, stailq);
|
||||
pool->cache_count++;
|
||||
} else {
|
||||
spdk_mempool_put(pool->pool, iobuf_buf);
|
||||
spdk_mempool_put(pool->pool, buf);
|
||||
}
|
||||
} else {
|
||||
entry = STAILQ_FIRST(pool->queue);
|
||||
|
@ -2943,8 +2943,7 @@ spdk_iobuf_initialize(void)
|
||||
int rc = 0;
|
||||
|
||||
g_iobuf.small_pool = spdk_mempool_create("iobuf_small_pool", opts->small_pool_count,
|
||||
opts->small_bufsize + SPDK_IOBUF_DATA_OFFSET, 0,
|
||||
SPDK_ENV_SOCKET_ID_ANY);
|
||||
opts->small_bufsize, 0, SPDK_ENV_SOCKET_ID_ANY);
|
||||
if (!g_iobuf.small_pool) {
|
||||
SPDK_ERRLOG("Failed to create small iobuf pool\n");
|
||||
rc = -ENOMEM;
|
||||
@ -2952,8 +2951,7 @@ spdk_iobuf_initialize(void)
|
||||
}
|
||||
|
||||
g_iobuf.large_pool = spdk_mempool_create("iobuf_large_pool", opts->large_pool_count,
|
||||
opts->large_bufsize + SPDK_IOBUF_DATA_OFFSET, 0,
|
||||
SPDK_ENV_SOCKET_ID_ANY);
|
||||
opts->large_bufsize, 0, SPDK_ENV_SOCKET_ID_ANY);
|
||||
if (!g_iobuf.large_pool) {
|
||||
SPDK_ERRLOG("Failed to create large iobuf pool\n");
|
||||
rc = -ENOMEM;
|
||||
|
@ -13,6 +13,9 @@
|
||||
#include "thread/thread.c"
|
||||
#include "common/lib/ut_multithread.c"
|
||||
|
||||
#define SMALL_BUFSIZE 128
|
||||
#define LARGE_BUFSIZE 512
|
||||
|
||||
static int g_sched_rc = 0;
|
||||
|
||||
static int
|
||||
@ -1951,8 +1954,8 @@ iobuf(void)
|
||||
struct spdk_iobuf_opts opts = {
|
||||
.small_pool_count = 2,
|
||||
.large_pool_count = 2,
|
||||
.small_bufsize = 2,
|
||||
.large_bufsize = 4,
|
||||
.small_bufsize = SMALL_BUFSIZE,
|
||||
.large_bufsize = LARGE_BUFSIZE,
|
||||
};
|
||||
struct ut_iobuf_entry *entry;
|
||||
struct spdk_iobuf_channel mod0_ch[2], mod1_ch[2];
|
||||
@ -2017,32 +2020,32 @@ iobuf(void)
|
||||
/* First check that it's possible to retrieve the whole pools from a single module */
|
||||
set_thread(0);
|
||||
entry = &mod0_entries[0];
|
||||
entry->buf = spdk_iobuf_get(entry->ioch, 4, &entry->iobuf, ut_iobuf_get_buf_cb);
|
||||
entry->buf = spdk_iobuf_get(entry->ioch, LARGE_BUFSIZE, &entry->iobuf, ut_iobuf_get_buf_cb);
|
||||
CU_ASSERT_PTR_NOT_NULL(entry->buf);
|
||||
entry = &mod0_entries[1];
|
||||
entry->buf = spdk_iobuf_get(entry->ioch, 4, &entry->iobuf, ut_iobuf_get_buf_cb);
|
||||
entry->buf = spdk_iobuf_get(entry->ioch, LARGE_BUFSIZE, &entry->iobuf, ut_iobuf_get_buf_cb);
|
||||
CU_ASSERT_PTR_NOT_NULL(entry->buf);
|
||||
/* The next two should be put onto the large buf wait queue */
|
||||
entry = &mod0_entries[2];
|
||||
entry->buf = spdk_iobuf_get(entry->ioch, 4, &entry->iobuf, ut_iobuf_get_buf_cb);
|
||||
entry->buf = spdk_iobuf_get(entry->ioch, LARGE_BUFSIZE, &entry->iobuf, ut_iobuf_get_buf_cb);
|
||||
CU_ASSERT_PTR_NULL(entry->buf);
|
||||
entry = &mod0_entries[3];
|
||||
entry->buf = spdk_iobuf_get(entry->ioch, 4, &entry->iobuf, ut_iobuf_get_buf_cb);
|
||||
entry->buf = spdk_iobuf_get(entry->ioch, LARGE_BUFSIZE, &entry->iobuf, ut_iobuf_get_buf_cb);
|
||||
CU_ASSERT_PTR_NULL(entry->buf);
|
||||
/* Pick the two next buffers from the small pool */
|
||||
set_thread(1);
|
||||
entry = &mod0_entries[4];
|
||||
entry->buf = spdk_iobuf_get(entry->ioch, 2, &entry->iobuf, ut_iobuf_get_buf_cb);
|
||||
entry->buf = spdk_iobuf_get(entry->ioch, SMALL_BUFSIZE, &entry->iobuf, ut_iobuf_get_buf_cb);
|
||||
CU_ASSERT_PTR_NOT_NULL(entry->buf);
|
||||
entry = &mod0_entries[5];
|
||||
entry->buf = spdk_iobuf_get(entry->ioch, 2, &entry->iobuf, ut_iobuf_get_buf_cb);
|
||||
entry->buf = spdk_iobuf_get(entry->ioch, SMALL_BUFSIZE, &entry->iobuf, ut_iobuf_get_buf_cb);
|
||||
CU_ASSERT_PTR_NOT_NULL(entry->buf);
|
||||
/* The next two should be put onto the small buf wait queue */
|
||||
entry = &mod0_entries[6];
|
||||
entry->buf = spdk_iobuf_get(entry->ioch, 2, &entry->iobuf, ut_iobuf_get_buf_cb);
|
||||
entry->buf = spdk_iobuf_get(entry->ioch, SMALL_BUFSIZE, &entry->iobuf, ut_iobuf_get_buf_cb);
|
||||
CU_ASSERT_PTR_NULL(entry->buf);
|
||||
entry = &mod0_entries[7];
|
||||
entry->buf = spdk_iobuf_get(entry->ioch, 2, &entry->iobuf, ut_iobuf_get_buf_cb);
|
||||
entry->buf = spdk_iobuf_get(entry->ioch, SMALL_BUFSIZE, &entry->iobuf, ut_iobuf_get_buf_cb);
|
||||
CU_ASSERT_PTR_NULL(entry->buf);
|
||||
|
||||
/* Now return one of the large buffers to the pool and verify that the first request's
|
||||
@ -2050,7 +2053,7 @@ iobuf(void)
|
||||
*/
|
||||
set_thread(0);
|
||||
entry = &mod0_entries[0];
|
||||
spdk_iobuf_put(entry->ioch, entry->buf, 4);
|
||||
spdk_iobuf_put(entry->ioch, entry->buf, LARGE_BUFSIZE);
|
||||
entry = &mod0_entries[2];
|
||||
CU_ASSERT_PTR_NOT_NULL(entry->buf);
|
||||
entry = &mod0_entries[3];
|
||||
@ -2058,15 +2061,15 @@ iobuf(void)
|
||||
|
||||
/* Return the second buffer and check that the other request is satisfied */
|
||||
entry = &mod0_entries[1];
|
||||
spdk_iobuf_put(entry->ioch, entry->buf, 4);
|
||||
spdk_iobuf_put(entry->ioch, entry->buf, LARGE_BUFSIZE);
|
||||
entry = &mod0_entries[3];
|
||||
CU_ASSERT_PTR_NOT_NULL(entry->buf);
|
||||
|
||||
/* Return the remaining two buffers */
|
||||
entry = &mod0_entries[2];
|
||||
spdk_iobuf_put(entry->ioch, entry->buf, 4);
|
||||
spdk_iobuf_put(entry->ioch, entry->buf, LARGE_BUFSIZE);
|
||||
entry = &mod0_entries[3];
|
||||
spdk_iobuf_put(entry->ioch, entry->buf, 4);
|
||||
spdk_iobuf_put(entry->ioch, entry->buf, LARGE_BUFSIZE);
|
||||
|
||||
/* Check that it didn't change the requests waiting for the small buffers */
|
||||
entry = &mod0_entries[6];
|
||||
@ -2077,7 +2080,7 @@ iobuf(void)
|
||||
/* Do the same test as above, this time using the small pool */
|
||||
set_thread(1);
|
||||
entry = &mod0_entries[4];
|
||||
spdk_iobuf_put(entry->ioch, entry->buf, 2);
|
||||
spdk_iobuf_put(entry->ioch, entry->buf, SMALL_BUFSIZE);
|
||||
entry = &mod0_entries[6];
|
||||
CU_ASSERT_PTR_NOT_NULL(entry->buf);
|
||||
entry = &mod0_entries[7];
|
||||
@ -2085,56 +2088,56 @@ iobuf(void)
|
||||
|
||||
/* Return the second buffer and check that the other request is satisfied */
|
||||
entry = &mod0_entries[5];
|
||||
spdk_iobuf_put(entry->ioch, entry->buf, 2);
|
||||
spdk_iobuf_put(entry->ioch, entry->buf, SMALL_BUFSIZE);
|
||||
entry = &mod0_entries[7];
|
||||
CU_ASSERT_PTR_NOT_NULL(entry->buf);
|
||||
|
||||
/* Return the remaining two buffers */
|
||||
entry = &mod0_entries[6];
|
||||
spdk_iobuf_put(entry->ioch, entry->buf, 2);
|
||||
spdk_iobuf_put(entry->ioch, entry->buf, SMALL_BUFSIZE);
|
||||
entry = &mod0_entries[7];
|
||||
spdk_iobuf_put(entry->ioch, entry->buf, 2);
|
||||
spdk_iobuf_put(entry->ioch, entry->buf, SMALL_BUFSIZE);
|
||||
|
||||
/* Now check requesting buffers from different modules - first request all of them from one
|
||||
* module, starting from the large pool
|
||||
*/
|
||||
set_thread(0);
|
||||
entry = &mod0_entries[0];
|
||||
entry->buf = spdk_iobuf_get(entry->ioch, 4, &entry->iobuf, ut_iobuf_get_buf_cb);
|
||||
entry->buf = spdk_iobuf_get(entry->ioch, LARGE_BUFSIZE, &entry->iobuf, ut_iobuf_get_buf_cb);
|
||||
CU_ASSERT_PTR_NOT_NULL(entry->buf);
|
||||
entry = &mod0_entries[1];
|
||||
entry->buf = spdk_iobuf_get(entry->ioch, 4, &entry->iobuf, ut_iobuf_get_buf_cb);
|
||||
entry->buf = spdk_iobuf_get(entry->ioch, LARGE_BUFSIZE, &entry->iobuf, ut_iobuf_get_buf_cb);
|
||||
CU_ASSERT_PTR_NOT_NULL(entry->buf);
|
||||
/* Request all of them from the small one */
|
||||
set_thread(1);
|
||||
entry = &mod0_entries[4];
|
||||
entry->buf = spdk_iobuf_get(entry->ioch, 2, &entry->iobuf, ut_iobuf_get_buf_cb);
|
||||
entry->buf = spdk_iobuf_get(entry->ioch, SMALL_BUFSIZE, &entry->iobuf, ut_iobuf_get_buf_cb);
|
||||
CU_ASSERT_PTR_NOT_NULL(entry->buf);
|
||||
entry = &mod0_entries[5];
|
||||
entry->buf = spdk_iobuf_get(entry->ioch, 2, &entry->iobuf, ut_iobuf_get_buf_cb);
|
||||
entry->buf = spdk_iobuf_get(entry->ioch, SMALL_BUFSIZE, &entry->iobuf, ut_iobuf_get_buf_cb);
|
||||
CU_ASSERT_PTR_NOT_NULL(entry->buf);
|
||||
|
||||
/* Request one buffer per module from each pool */
|
||||
set_thread(0);
|
||||
entry = &mod1_entries[0];
|
||||
entry->buf = spdk_iobuf_get(entry->ioch, 4, &entry->iobuf, ut_iobuf_get_buf_cb);
|
||||
entry->buf = spdk_iobuf_get(entry->ioch, LARGE_BUFSIZE, &entry->iobuf, ut_iobuf_get_buf_cb);
|
||||
CU_ASSERT_PTR_NULL(entry->buf);
|
||||
entry = &mod0_entries[3];
|
||||
entry->buf = spdk_iobuf_get(entry->ioch, 4, &entry->iobuf, ut_iobuf_get_buf_cb);
|
||||
entry->buf = spdk_iobuf_get(entry->ioch, LARGE_BUFSIZE, &entry->iobuf, ut_iobuf_get_buf_cb);
|
||||
CU_ASSERT_PTR_NULL(entry->buf);
|
||||
/* Change the order from the small pool and request a buffer from mod0 first */
|
||||
set_thread(1);
|
||||
entry = &mod0_entries[6];
|
||||
entry->buf = spdk_iobuf_get(entry->ioch, 2, &entry->iobuf, ut_iobuf_get_buf_cb);
|
||||
entry->buf = spdk_iobuf_get(entry->ioch, SMALL_BUFSIZE, &entry->iobuf, ut_iobuf_get_buf_cb);
|
||||
CU_ASSERT_PTR_NULL(entry->buf);
|
||||
entry = &mod1_entries[4];
|
||||
entry->buf = spdk_iobuf_get(entry->ioch, 2, &entry->iobuf, ut_iobuf_get_buf_cb);
|
||||
entry->buf = spdk_iobuf_get(entry->ioch, SMALL_BUFSIZE, &entry->iobuf, ut_iobuf_get_buf_cb);
|
||||
CU_ASSERT_PTR_NULL(entry->buf);
|
||||
|
||||
/* Now return one buffer to the large pool */
|
||||
set_thread(0);
|
||||
entry = &mod0_entries[0];
|
||||
spdk_iobuf_put(entry->ioch, entry->buf, 4);
|
||||
spdk_iobuf_put(entry->ioch, entry->buf, LARGE_BUFSIZE);
|
||||
|
||||
/* Make sure the request from mod1 got the buffer, as it was the first to request it */
|
||||
entry = &mod1_entries[0];
|
||||
@ -2144,22 +2147,22 @@ iobuf(void)
|
||||
|
||||
/* Return second buffer to the large pool and check the outstanding mod0 request */
|
||||
entry = &mod0_entries[1];
|
||||
spdk_iobuf_put(entry->ioch, entry->buf, 4);
|
||||
spdk_iobuf_put(entry->ioch, entry->buf, LARGE_BUFSIZE);
|
||||
entry = &mod0_entries[3];
|
||||
CU_ASSERT_PTR_NOT_NULL(entry->buf);
|
||||
|
||||
/* Return the remaining two buffers */
|
||||
entry = &mod1_entries[0];
|
||||
spdk_iobuf_put(entry->ioch, entry->buf, 4);
|
||||
spdk_iobuf_put(entry->ioch, entry->buf, LARGE_BUFSIZE);
|
||||
entry = &mod0_entries[3];
|
||||
spdk_iobuf_put(entry->ioch, entry->buf, 4);
|
||||
spdk_iobuf_put(entry->ioch, entry->buf, LARGE_BUFSIZE);
|
||||
|
||||
/* Check the same for the small pool, but this time the order of the request is reversed
|
||||
* (mod0 before mod1)
|
||||
*/
|
||||
set_thread(1);
|
||||
entry = &mod0_entries[4];
|
||||
spdk_iobuf_put(entry->ioch, entry->buf, 2);
|
||||
spdk_iobuf_put(entry->ioch, entry->buf, SMALL_BUFSIZE);
|
||||
entry = &mod0_entries[6];
|
||||
CU_ASSERT_PTR_NOT_NULL(entry->buf);
|
||||
/* mod1 request was second in this case, so it still needs to wait */
|
||||
@ -2168,111 +2171,111 @@ iobuf(void)
|
||||
|
||||
/* Return the second requested buffer */
|
||||
entry = &mod0_entries[5];
|
||||
spdk_iobuf_put(entry->ioch, entry->buf, 2);
|
||||
spdk_iobuf_put(entry->ioch, entry->buf, SMALL_BUFSIZE);
|
||||
entry = &mod1_entries[4];
|
||||
CU_ASSERT_PTR_NOT_NULL(entry->buf);
|
||||
|
||||
/* Return the remaining two buffers */
|
||||
entry = &mod0_entries[6];
|
||||
spdk_iobuf_put(entry->ioch, entry->buf, 2);
|
||||
spdk_iobuf_put(entry->ioch, entry->buf, SMALL_BUFSIZE);
|
||||
entry = &mod1_entries[4];
|
||||
spdk_iobuf_put(entry->ioch, entry->buf, 2);
|
||||
spdk_iobuf_put(entry->ioch, entry->buf, SMALL_BUFSIZE);
|
||||
|
||||
/* Request buffers to make the pools empty */
|
||||
set_thread(0);
|
||||
entry = &mod0_entries[0];
|
||||
entry->buf = spdk_iobuf_get(entry->ioch, 4, &entry->iobuf, ut_iobuf_get_buf_cb);
|
||||
entry->buf = spdk_iobuf_get(entry->ioch, LARGE_BUFSIZE, &entry->iobuf, ut_iobuf_get_buf_cb);
|
||||
CU_ASSERT_PTR_NOT_NULL(entry->buf);
|
||||
entry = &mod1_entries[0];
|
||||
entry->buf = spdk_iobuf_get(entry->ioch, 4, &entry->iobuf, ut_iobuf_get_buf_cb);
|
||||
entry->buf = spdk_iobuf_get(entry->ioch, LARGE_BUFSIZE, &entry->iobuf, ut_iobuf_get_buf_cb);
|
||||
CU_ASSERT_PTR_NOT_NULL(entry->buf);
|
||||
entry = &mod0_entries[1];
|
||||
entry->buf = spdk_iobuf_get(entry->ioch, 2, &entry->iobuf, ut_iobuf_get_buf_cb);
|
||||
entry->buf = spdk_iobuf_get(entry->ioch, SMALL_BUFSIZE, &entry->iobuf, ut_iobuf_get_buf_cb);
|
||||
CU_ASSERT_PTR_NOT_NULL(entry->buf);
|
||||
entry = &mod1_entries[1];
|
||||
entry->buf = spdk_iobuf_get(entry->ioch, 2, &entry->iobuf, ut_iobuf_get_buf_cb);
|
||||
entry->buf = spdk_iobuf_get(entry->ioch, SMALL_BUFSIZE, &entry->iobuf, ut_iobuf_get_buf_cb);
|
||||
CU_ASSERT_PTR_NOT_NULL(entry->buf);
|
||||
|
||||
/* Queue more requests from both modules */
|
||||
entry = &mod0_entries[2];
|
||||
entry->buf = spdk_iobuf_get(entry->ioch, 4, &entry->iobuf, ut_iobuf_get_buf_cb);
|
||||
entry->buf = spdk_iobuf_get(entry->ioch, LARGE_BUFSIZE, &entry->iobuf, ut_iobuf_get_buf_cb);
|
||||
CU_ASSERT_PTR_NULL(entry->buf);
|
||||
entry = &mod1_entries[2];
|
||||
entry->buf = spdk_iobuf_get(entry->ioch, 4, &entry->iobuf, ut_iobuf_get_buf_cb);
|
||||
entry->buf = spdk_iobuf_get(entry->ioch, LARGE_BUFSIZE, &entry->iobuf, ut_iobuf_get_buf_cb);
|
||||
CU_ASSERT_PTR_NULL(entry->buf);
|
||||
entry = &mod1_entries[3];
|
||||
entry->buf = spdk_iobuf_get(entry->ioch, 2, &entry->iobuf, ut_iobuf_get_buf_cb);
|
||||
entry->buf = spdk_iobuf_get(entry->ioch, SMALL_BUFSIZE, &entry->iobuf, ut_iobuf_get_buf_cb);
|
||||
CU_ASSERT_PTR_NULL(entry->buf);
|
||||
entry = &mod0_entries[3];
|
||||
entry->buf = spdk_iobuf_get(entry->ioch, 2, &entry->iobuf, ut_iobuf_get_buf_cb);
|
||||
entry->buf = spdk_iobuf_get(entry->ioch, SMALL_BUFSIZE, &entry->iobuf, ut_iobuf_get_buf_cb);
|
||||
CU_ASSERT_PTR_NULL(entry->buf);
|
||||
|
||||
/* Check that abort correctly remove an entry from the queue */
|
||||
entry = &mod0_entries[2];
|
||||
spdk_iobuf_entry_abort(entry->ioch, &entry->iobuf, 4);
|
||||
spdk_iobuf_entry_abort(entry->ioch, &entry->iobuf, LARGE_BUFSIZE);
|
||||
entry = &mod1_entries[3];
|
||||
spdk_iobuf_entry_abort(entry->ioch, &entry->iobuf, 2);
|
||||
spdk_iobuf_entry_abort(entry->ioch, &entry->iobuf, SMALL_BUFSIZE);
|
||||
|
||||
entry = &mod0_entries[0];
|
||||
spdk_iobuf_put(entry->ioch, entry->buf, 4);
|
||||
spdk_iobuf_put(entry->ioch, entry->buf, LARGE_BUFSIZE);
|
||||
CU_ASSERT_PTR_NOT_NULL(mod1_entries[2].buf);
|
||||
entry = &mod0_entries[1];
|
||||
spdk_iobuf_put(entry->ioch, entry->buf, 2);
|
||||
spdk_iobuf_put(entry->ioch, entry->buf, SMALL_BUFSIZE);
|
||||
CU_ASSERT_PTR_NOT_NULL(mod0_entries[3].buf);
|
||||
|
||||
/* Clean up */
|
||||
entry = &mod1_entries[0];
|
||||
spdk_iobuf_put(entry->ioch, entry->buf, 4);
|
||||
spdk_iobuf_put(entry->ioch, entry->buf, LARGE_BUFSIZE);
|
||||
entry = &mod1_entries[2];
|
||||
spdk_iobuf_put(entry->ioch, entry->buf, 4);
|
||||
spdk_iobuf_put(entry->ioch, entry->buf, LARGE_BUFSIZE);
|
||||
entry = &mod1_entries[1];
|
||||
spdk_iobuf_put(entry->ioch, entry->buf, 2);
|
||||
spdk_iobuf_put(entry->ioch, entry->buf, SMALL_BUFSIZE);
|
||||
entry = &mod0_entries[3];
|
||||
spdk_iobuf_put(entry->ioch, entry->buf, 2);
|
||||
spdk_iobuf_put(entry->ioch, entry->buf, SMALL_BUFSIZE);
|
||||
|
||||
/* Request buffers to make the pools empty */
|
||||
set_thread(0);
|
||||
entry = &mod0_entries[0];
|
||||
entry->buf = spdk_iobuf_get(entry->ioch, 4, &entry->iobuf, ut_iobuf_get_buf_cb);
|
||||
entry->buf = spdk_iobuf_get(entry->ioch, LARGE_BUFSIZE, &entry->iobuf, ut_iobuf_get_buf_cb);
|
||||
CU_ASSERT_PTR_NOT_NULL(entry->buf);
|
||||
entry = &mod1_entries[0];
|
||||
entry->buf = spdk_iobuf_get(entry->ioch, 4, &entry->iobuf, ut_iobuf_get_buf_cb);
|
||||
entry->buf = spdk_iobuf_get(entry->ioch, LARGE_BUFSIZE, &entry->iobuf, ut_iobuf_get_buf_cb);
|
||||
CU_ASSERT_PTR_NOT_NULL(entry->buf);
|
||||
entry = &mod0_entries[1];
|
||||
entry->buf = spdk_iobuf_get(entry->ioch, 2, &entry->iobuf, ut_iobuf_get_buf_cb);
|
||||
entry->buf = spdk_iobuf_get(entry->ioch, SMALL_BUFSIZE, &entry->iobuf, ut_iobuf_get_buf_cb);
|
||||
CU_ASSERT_PTR_NOT_NULL(entry->buf);
|
||||
entry = &mod1_entries[1];
|
||||
entry->buf = spdk_iobuf_get(entry->ioch, 2, &entry->iobuf, ut_iobuf_get_buf_cb);
|
||||
entry->buf = spdk_iobuf_get(entry->ioch, SMALL_BUFSIZE, &entry->iobuf, ut_iobuf_get_buf_cb);
|
||||
CU_ASSERT_PTR_NOT_NULL(entry->buf);
|
||||
|
||||
/* Request a buffer from each queue and each module on thread 0 */
|
||||
set_thread(0);
|
||||
entry = &mod0_entries[2];
|
||||
entry->buf = spdk_iobuf_get(entry->ioch, 4, &entry->iobuf, ut_iobuf_get_buf_cb);
|
||||
entry->buf = spdk_iobuf_get(entry->ioch, LARGE_BUFSIZE, &entry->iobuf, ut_iobuf_get_buf_cb);
|
||||
CU_ASSERT_PTR_NULL(entry->buf);
|
||||
entry = &mod1_entries[2];
|
||||
entry->buf = spdk_iobuf_get(entry->ioch, 4, &entry->iobuf, ut_iobuf_get_buf_cb);
|
||||
entry->buf = spdk_iobuf_get(entry->ioch, LARGE_BUFSIZE, &entry->iobuf, ut_iobuf_get_buf_cb);
|
||||
CU_ASSERT_PTR_NULL(entry->buf);
|
||||
entry = &mod0_entries[3];
|
||||
entry->buf = spdk_iobuf_get(entry->ioch, 2, &entry->iobuf, ut_iobuf_get_buf_cb);
|
||||
entry->buf = spdk_iobuf_get(entry->ioch, SMALL_BUFSIZE, &entry->iobuf, ut_iobuf_get_buf_cb);
|
||||
CU_ASSERT_PTR_NULL(entry->buf);
|
||||
entry = &mod1_entries[3];
|
||||
entry->buf = spdk_iobuf_get(entry->ioch, 2, &entry->iobuf, ut_iobuf_get_buf_cb);
|
||||
entry->buf = spdk_iobuf_get(entry->ioch, SMALL_BUFSIZE, &entry->iobuf, ut_iobuf_get_buf_cb);
|
||||
CU_ASSERT_PTR_NULL(entry->buf);
|
||||
|
||||
/* Do the same on thread 1 */
|
||||
set_thread(1);
|
||||
entry = &mod0_entries[6];
|
||||
entry->buf = spdk_iobuf_get(entry->ioch, 4, &entry->iobuf, ut_iobuf_get_buf_cb);
|
||||
entry->buf = spdk_iobuf_get(entry->ioch, LARGE_BUFSIZE, &entry->iobuf, ut_iobuf_get_buf_cb);
|
||||
CU_ASSERT_PTR_NULL(entry->buf);
|
||||
entry = &mod1_entries[6];
|
||||
entry->buf = spdk_iobuf_get(entry->ioch, 4, &entry->iobuf, ut_iobuf_get_buf_cb);
|
||||
entry->buf = spdk_iobuf_get(entry->ioch, LARGE_BUFSIZE, &entry->iobuf, ut_iobuf_get_buf_cb);
|
||||
CU_ASSERT_PTR_NULL(entry->buf);
|
||||
entry = &mod0_entries[7];
|
||||
entry->buf = spdk_iobuf_get(entry->ioch, 2, &entry->iobuf, ut_iobuf_get_buf_cb);
|
||||
entry->buf = spdk_iobuf_get(entry->ioch, SMALL_BUFSIZE, &entry->iobuf, ut_iobuf_get_buf_cb);
|
||||
CU_ASSERT_PTR_NULL(entry->buf);
|
||||
entry = &mod1_entries[7];
|
||||
entry->buf = spdk_iobuf_get(entry->ioch, 2, &entry->iobuf, ut_iobuf_get_buf_cb);
|
||||
entry->buf = spdk_iobuf_get(entry->ioch, SMALL_BUFSIZE, &entry->iobuf, ut_iobuf_get_buf_cb);
|
||||
CU_ASSERT_PTR_NULL(entry->buf);
|
||||
|
||||
/* Now do the foreach and check that correct entries are iterated over by assigning their
|
||||
@ -2319,32 +2322,32 @@ iobuf(void)
|
||||
/* Clean everything up */
|
||||
set_thread(0);
|
||||
entry = &mod0_entries[2];
|
||||
spdk_iobuf_entry_abort(entry->ioch, &entry->iobuf, 4);
|
||||
spdk_iobuf_entry_abort(entry->ioch, &entry->iobuf, LARGE_BUFSIZE);
|
||||
entry = &mod0_entries[3];
|
||||
spdk_iobuf_entry_abort(entry->ioch, &entry->iobuf, 2);
|
||||
spdk_iobuf_entry_abort(entry->ioch, &entry->iobuf, SMALL_BUFSIZE);
|
||||
entry = &mod1_entries[2];
|
||||
spdk_iobuf_entry_abort(entry->ioch, &entry->iobuf, 4);
|
||||
spdk_iobuf_entry_abort(entry->ioch, &entry->iobuf, LARGE_BUFSIZE);
|
||||
entry = &mod1_entries[3];
|
||||
spdk_iobuf_entry_abort(entry->ioch, &entry->iobuf, 2);
|
||||
spdk_iobuf_entry_abort(entry->ioch, &entry->iobuf, SMALL_BUFSIZE);
|
||||
|
||||
entry = &mod0_entries[0];
|
||||
spdk_iobuf_put(entry->ioch, entry->buf, 4);
|
||||
spdk_iobuf_put(entry->ioch, entry->buf, LARGE_BUFSIZE);
|
||||
entry = &mod1_entries[0];
|
||||
spdk_iobuf_put(entry->ioch, entry->buf, 4);
|
||||
spdk_iobuf_put(entry->ioch, entry->buf, LARGE_BUFSIZE);
|
||||
entry = &mod0_entries[1];
|
||||
spdk_iobuf_put(entry->ioch, entry->buf, 2);
|
||||
spdk_iobuf_put(entry->ioch, entry->buf, SMALL_BUFSIZE);
|
||||
entry = &mod1_entries[1];
|
||||
spdk_iobuf_put(entry->ioch, entry->buf, 2);
|
||||
spdk_iobuf_put(entry->ioch, entry->buf, SMALL_BUFSIZE);
|
||||
|
||||
set_thread(1);
|
||||
entry = &mod0_entries[6];
|
||||
spdk_iobuf_entry_abort(entry->ioch, &entry->iobuf, 4);
|
||||
spdk_iobuf_entry_abort(entry->ioch, &entry->iobuf, LARGE_BUFSIZE);
|
||||
entry = &mod0_entries[7];
|
||||
spdk_iobuf_entry_abort(entry->ioch, &entry->iobuf, 2);
|
||||
spdk_iobuf_entry_abort(entry->ioch, &entry->iobuf, SMALL_BUFSIZE);
|
||||
entry = &mod1_entries[6];
|
||||
spdk_iobuf_entry_abort(entry->ioch, &entry->iobuf, 4);
|
||||
spdk_iobuf_entry_abort(entry->ioch, &entry->iobuf, LARGE_BUFSIZE);
|
||||
entry = &mod1_entries[7];
|
||||
spdk_iobuf_entry_abort(entry->ioch, &entry->iobuf, 2);
|
||||
spdk_iobuf_entry_abort(entry->ioch, &entry->iobuf, SMALL_BUFSIZE);
|
||||
|
||||
set_thread(0);
|
||||
spdk_iobuf_channel_fini(&mod0_ch[0]);
|
||||
@ -2372,8 +2375,8 @@ iobuf_cache(void)
|
||||
struct spdk_iobuf_opts opts = {
|
||||
.small_pool_count = 4,
|
||||
.large_pool_count = 4,
|
||||
.small_bufsize = 2,
|
||||
.large_bufsize = 4,
|
||||
.small_bufsize = SMALL_BUFSIZE,
|
||||
.large_bufsize = LARGE_BUFSIZE,
|
||||
};
|
||||
struct spdk_iobuf_channel iobuf_ch[2];
|
||||
struct ut_iobuf_entry *entry;
|
||||
@ -2429,7 +2432,7 @@ iobuf_cache(void)
|
||||
CU_ASSERT_EQUAL(rc, 0);
|
||||
|
||||
for (i = 0; i < 3; ++i) {
|
||||
mod0_entries[i].buf = spdk_iobuf_get(&iobuf_ch[0], 4, &mod0_entries[i].iobuf,
|
||||
mod0_entries[i].buf = spdk_iobuf_get(&iobuf_ch[0], LARGE_BUFSIZE, &mod0_entries[i].iobuf,
|
||||
ut_iobuf_get_buf_cb);
|
||||
CU_ASSERT_PTR_NOT_NULL(mod0_entries[i].buf);
|
||||
}
|
||||
@ -2445,12 +2448,12 @@ iobuf_cache(void)
|
||||
CU_ASSERT_EQUAL(rc, -ENOMEM);
|
||||
|
||||
for (i = 0; i < 2; ++i) {
|
||||
spdk_iobuf_put(&iobuf_ch[0], mod0_entries[i].buf, 4);
|
||||
spdk_iobuf_put(&iobuf_ch[0], mod0_entries[i].buf, LARGE_BUFSIZE);
|
||||
rc = spdk_iobuf_channel_init(&iobuf_ch[1], "ut_module1", 2, 2);
|
||||
CU_ASSERT_EQUAL(rc, -ENOMEM);
|
||||
}
|
||||
|
||||
spdk_iobuf_put(&iobuf_ch[0], mod0_entries[2].buf, 4);
|
||||
spdk_iobuf_put(&iobuf_ch[0], mod0_entries[2].buf, LARGE_BUFSIZE);
|
||||
|
||||
/* The last buffer should be released back to the pool, so we should be able to create a new
|
||||
* channel
|
||||
@ -2470,7 +2473,7 @@ iobuf_cache(void)
|
||||
rc = spdk_iobuf_channel_init(&iobuf_ch[1], "ut_module1", 1, 1);
|
||||
CU_ASSERT_EQUAL(rc, 0);
|
||||
|
||||
uint32_t buffer_sizes[] = { 2, 4 };
|
||||
uint32_t buffer_sizes[] = { SMALL_BUFSIZE, LARGE_BUFSIZE };
|
||||
for (i = 0; i < SPDK_COUNTOF(buffer_sizes); ++i) {
|
||||
bufsize = buffer_sizes[i];
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user