}
/*
- * test function for mempool test based on singple consumer and single producer,
+ * test function for mempool test based on single consumer and single producer,
* can run on one lcore only
*/
static int
}
/*
- * it tests the mempool operations based on singple producer and single consumer
+ * it tests the mempool operations based on single producer and single consumer
*/
static int
test_mempool_sp_sc(void)
#undef RTE_TEST_TRACE_FAILURE
#define RTE_TEST_TRACE_FAILURE(...) do { goto fail; } while (0)
- static const size_t CB_NUM = 3;
- static const size_t MP_NUM = 2;
+ static const size_t callback_num = 3;
+ static const size_t mempool_num = 2;
+ static const unsigned int mempool_elt_size = 64;
+ static const unsigned int mempool_size = 64;
- struct test_mempool_events_data data[CB_NUM];
- struct rte_mempool *mp[MP_NUM], *freed;
+ struct test_mempool_events_data data[callback_num];
+ struct rte_mempool *mp[mempool_num], *freed;
char name[RTE_MEMPOOL_NAMESIZE];
size_t i, j;
int ret;
memset(mp, 0, sizeof(mp));
- for (i = 0; i < CB_NUM; i++) {
+ for (i = 0; i < callback_num; i++) {
ret = rte_mempool_event_callback_register
(test_mempool_events_cb, &data[i]);
RTE_TEST_ASSERT_EQUAL(ret, 0, "Failed to register the callback %zu: %s",
/* Create mempool 0 that will be observed by all callbacks. */
memset(&data, 0, sizeof(data));
strcpy(name, "empty0");
- mp[0] = rte_mempool_create_empty(name, MEMPOOL_SIZE,
- MEMPOOL_ELT_SIZE, 0, 0,
+ mp[0] = rte_mempool_create_empty(name, mempool_size,
+ mempool_elt_size, 0, 0,
SOCKET_ID_ANY, 0);
RTE_TEST_ASSERT_NOT_NULL(mp[0], "Cannot create mempool %s: %s",
name, rte_strerror(rte_errno));
- for (j = 0; j < CB_NUM; j++)
+ for (j = 0; j < callback_num; j++)
RTE_TEST_ASSERT_EQUAL(data[j].invoked, false,
"Callback %zu invoked on %s mempool creation",
j, name);
ret = populate(mp[0]);
RTE_TEST_ASSERT_EQUAL(ret, (int)mp[0]->size, "Failed to populate mempool %s: %s",
name, rte_strerror(-ret));
- for (j = 0; j < CB_NUM; j++) {
+ for (j = 0; j < callback_num; j++) {
RTE_TEST_ASSERT_EQUAL(data[j].invoked, true,
"Callback %zu not invoked on mempool %s population",
j, name);
rte_strerror(rte_errno));
memset(&data, 0, sizeof(data));
strcpy(name, "empty1");
- mp[1] = rte_mempool_create_empty(name, MEMPOOL_SIZE,
- MEMPOOL_ELT_SIZE, 0, 0,
+ mp[1] = rte_mempool_create_empty(name, mempool_size,
+ mempool_elt_size, 0, 0,
SOCKET_ID_ANY, 0);
RTE_TEST_ASSERT_NOT_NULL(mp[1], "Cannot create mempool %s: %s",
name, rte_strerror(rte_errno));
"Unregistered callback 0 invoked on %s mempool populaton",
name);
- for (i = 0; i < MP_NUM; i++) {
+ for (i = 0; i < mempool_num; i++) {
memset(&data, 0, sizeof(data));
sprintf(name, "empty%zu", i);
rte_mempool_free(mp[i]);
*/
freed = mp[i];
mp[i] = NULL;
- for (j = 1; j < CB_NUM; j++) {
+ for (j = 1; j < callback_num; j++) {
RTE_TEST_ASSERT_EQUAL(data[j].invoked, true,
"Callback %zu not invoked on mempool %s destruction",
j, name);
name);
}
- for (j = 1; j < CB_NUM; j++) {
+ for (j = 1; j < callback_num; j++) {
ret = rte_mempool_event_callback_unregister
(test_mempool_events_cb, &data[j]);
RTE_TEST_ASSERT_EQUAL(ret, 0, "Failed to unregister the callback %zu: %s",
return TEST_SUCCESS;
fail:
- for (j = 0; j < CB_NUM; j++)
+ for (j = 0; j < callback_num; j++)
rte_mempool_event_callback_unregister
(test_mempool_events_cb, &data[j]);
- for (i = 0; i < MP_NUM; i++)
+ for (i = 0; i < mempool_num; i++)
rte_mempool_free(mp[i]);
return TEST_FAILED;
static int
test_mempool_flag_non_io_set_when_no_iova_contig_set(void)
{
+ const struct rte_memzone *mz = NULL;
+ void *virt;
+ rte_iova_t iova;
+ size_t size = MEMPOOL_ELT_SIZE * 16;
struct rte_mempool *mp = NULL;
int ret;
+ mz = rte_memzone_reserve("test_mempool", size, SOCKET_ID_ANY, 0);
+ RTE_TEST_ASSERT_NOT_NULL(mz, "Cannot allocate memory");
+ virt = mz->addr;
+ iova = mz->iova;
mp = rte_mempool_create_empty("empty", MEMPOOL_SIZE,
MEMPOOL_ELT_SIZE, 0, 0,
SOCKET_ID_ANY, RTE_MEMPOOL_F_NO_IOVA_CONTIG);
RTE_TEST_ASSERT_NOT_NULL(mp, "Cannot create mempool: %s",
rte_strerror(rte_errno));
rte_mempool_set_ops_byname(mp, rte_mbuf_best_mempool_ops(), NULL);
- ret = rte_mempool_populate_default(mp);
+
+ RTE_TEST_ASSERT(mp->flags & RTE_MEMPOOL_F_NON_IO,
+ "NON_IO flag is not set on an empty mempool");
+
+ /*
+ * Always use valid IOVA so that populate() has no other reason
+ * to infer that the mempool cannot be used for IO.
+ */
+ ret = rte_mempool_populate_iova(mp, virt, iova, size, NULL, NULL);
RTE_TEST_ASSERT(ret > 0, "Failed to populate mempool: %s",
rte_strerror(-ret));
RTE_TEST_ASSERT(mp->flags & RTE_MEMPOOL_F_NON_IO,
ret = TEST_SUCCESS;
exit:
rte_mempool_free(mp);
+ rte_memzone_free(mz);
return ret;
}
static int
test_mempool_flag_non_io_unset_when_populated_with_valid_iova(void)
{
- void *virt = NULL;
+ const struct rte_memzone *mz = NULL;
+ void *virt;
rte_iova_t iova;
size_t total_size = MEMPOOL_ELT_SIZE * MEMPOOL_SIZE;
size_t block_size = total_size / 3;
/*
* Since objects from the pool are never used in the test,
* we don't care for contiguous IOVA, on the other hand,
- * reiuring it could cause spurious test failures.
+ * requiring it could cause spurious test failures.
*/
- virt = rte_malloc("test_mempool", total_size, rte_mem_page_size());
- RTE_TEST_ASSERT_NOT_NULL(virt, "Cannot allocate memory");
- iova = rte_mem_virt2iova(virt);
- RTE_TEST_ASSERT_NOT_EQUAL(iova, RTE_BAD_IOVA, "Cannot get IOVA");
+ mz = rte_memzone_reserve("test_mempool", total_size, SOCKET_ID_ANY, 0);
+ RTE_TEST_ASSERT_NOT_NULL(mz, "Cannot allocate memory");
+ virt = mz->addr;
+ iova = mz->iova;
mp = rte_mempool_create_empty("empty", MEMPOOL_SIZE,
MEMPOOL_ELT_SIZE, 0, 0,
SOCKET_ID_ANY, 0);
RTE_TEST_ASSERT_NOT_NULL(mp, "Cannot create mempool: %s",
rte_strerror(rte_errno));
+ RTE_TEST_ASSERT(mp->flags & RTE_MEMPOOL_F_NON_IO,
+ "NON_IO flag is not set on an empty mempool");
+
ret = rte_mempool_populate_iova(mp, RTE_PTR_ADD(virt, 1 * block_size),
RTE_BAD_IOVA, block_size, NULL, NULL);
RTE_TEST_ASSERT(ret > 0, "Failed to populate mempool: %s",
exit:
rte_mempool_free(mp);
- rte_free(virt);
- return ret;
-}
-
-static int
-test_mempool_flag_non_io_unset_by_default(void)
-{
- struct rte_mempool *mp;
- int ret;
-
- mp = rte_mempool_create_empty("empty", MEMPOOL_SIZE,
- MEMPOOL_ELT_SIZE, 0, 0,
- SOCKET_ID_ANY, 0);
- RTE_TEST_ASSERT_NOT_NULL(mp, "Cannot create mempool: %s",
- rte_strerror(rte_errno));
- ret = rte_mempool_populate_default(mp);
- RTE_TEST_ASSERT_EQUAL(ret, (int)mp->size, "Failed to populate mempool: %s",
- rte_strerror(-ret));
- RTE_TEST_ASSERT(!(mp->flags & RTE_MEMPOOL_F_NON_IO),
- "NON_IO flag is set by default");
- ret = TEST_SUCCESS;
-exit:
- rte_mempool_free(mp);
+ rte_memzone_free(mz);
return ret;
}
if (test_mempool_basic_ex(mp_nocache) < 0)
GOTO_ERR(ret, err);
- /* mempool operation test based on single producer and single comsumer */
+ /* mempool operation test based on single producer and single consumer */
if (test_mempool_sp_sc() < 0)
GOTO_ERR(ret, err);
GOTO_ERR(ret, err);
/* test NON_IO flag inference */
- if (test_mempool_flag_non_io_unset_by_default() < 0)
- GOTO_ERR(ret, err);
if (test_mempool_flag_non_io_set_when_no_iova_contig_set() < 0)
GOTO_ERR(ret, err);
if (test_mempool_flag_non_io_unset_when_populated_with_valid_iova() < 0)