Spdk/test/unit/lib/ftl/ftl_mempool.c/ftl_mempool_ut.c
Artur Paszkiewicz 71a1762821 ftl: mempool support for durable format objects
Allows for using shared memory in memory pools. Adds API for
accessing such pools after dirty shutdown (claiming them, ie.
marking an entry as actively used; calling the
ftl_mempool_initialize_ext will reclaim all unused entries back
to the pool). Also introduces API for accessing objects, since
using direct pointers is not possible (as addresses may change
inbetween application startups).

Signed-off-by: Artur Paszkiewicz <artur.paszkiewicz@intel.com>
Signed-off-by: Kozlowski Mateusz <mateusz.kozlowski@intel.com>
Change-Id: I5325b39d68aef7e231945cee9d92c925cab2fb2a
Reviewed-on: https://review.spdk.io/gerrit/c/spdk/spdk/+/13346
Community-CI: Mellanox Build Bot
Tested-by: SPDK CI Jenkins <sys_sgci@intel.com>
Reviewed-by: Jim Harris <james.r.harris@intel.com>
Reviewed-by: Ben Walker <benjamin.walker@intel.com>
2022-08-30 14:48:50 +00:00

102 lines
2.3 KiB
C

/* SPDX-License-Identifier: BSD-3-Clause
* Copyright (c) Intel Corporation.
* All rights reserved.
*/
#include "spdk/stdinc.h"
#include "spdk_cunit.h"
#include "common/lib/test_env.c"
#include "ftl/utils/ftl_mempool.c"
#define COUNT 16
#define ALIGNMENT 64
#define SIZE (ALIGNMENT * 2)
#define SOCKET_ID_ANY -1
DEFINE_STUB(ftl_bitmap_create, struct ftl_bitmap *, (void *buf, size_t size), NULL);
DEFINE_STUB_V(ftl_bitmap_destroy, (struct ftl_bitmap *bitmap));
DEFINE_STUB(ftl_bitmap_get, bool, (const struct ftl_bitmap *bitmap, uint64_t bit), true);
DEFINE_STUB_V(ftl_bitmap_set, (struct ftl_bitmap *bitmap, uint64_t bit));
DEFINE_STUB_V(ftl_bitmap_clear, (struct ftl_bitmap *bitmap, uint64_t bit));
static struct ftl_mempool *g_mpool;
static void
test_ftl_mempool_create(void)
{
struct ftl_mempool *mpool;
/* improper value of alignment */
mpool = ftl_mempool_create(COUNT, SIZE, ALIGNMENT + 1, SOCKET_ID_ANY);
CU_ASSERT_EQUAL(mpool, NULL);
}
static void
test_ftl_mempool_get_put(void)
{
void *elem[COUNT];
void *elem_empty;
void *elem_first = SLIST_FIRST(&g_mpool->list);
struct ftl_mempool_element *ftl_elem;
int i;
for (i = 0; i < COUNT; i++) {
elem[i] = ftl_mempool_get(g_mpool);
ftl_elem = elem[i];
CU_ASSERT_EQUAL(ftl_elem->entry.sle_next, SLIST_FIRST(&g_mpool->list));
}
CU_ASSERT(SLIST_EMPTY(&g_mpool->list));
elem_empty = ftl_mempool_get(g_mpool);
CU_ASSERT_EQUAL(elem_empty, NULL);
for (i = COUNT - 1; i >= 0; i--) {
ftl_mempool_put(g_mpool, elem[i]);
CU_ASSERT_EQUAL(SLIST_FIRST(&g_mpool->list), elem[i]);
}
CU_ASSERT_EQUAL(SLIST_FIRST(&g_mpool->list), elem_first);
}
static int
test_setup(void)
{
g_mpool = ftl_mempool_create(COUNT, SIZE, ALIGNMENT, SOCKET_ID_ANY);
if (!g_mpool) {
return -ENOMEM;
}
return 0;
}
static int
test_cleanup(void)
{
ftl_mempool_destroy(g_mpool);
g_mpool = NULL;
return 0;
}
int
main(int argc, char **argv)
{
CU_pSuite suite = NULL;
unsigned int num_failures;
CU_set_error_action(CUEA_ABORT);
CU_initialize_registry();
suite = CU_add_suite("ftl_mempool", test_setup, test_cleanup);
CU_ADD_TEST(suite, test_ftl_mempool_create);
CU_ADD_TEST(suite, test_ftl_mempool_get_put);
CU_basic_set_mode(CU_BRM_VERBOSE);
CU_basic_run_tests();
num_failures = CU_get_number_of_failures();
CU_cleanup_registry();
return num_failures;
}