* [dpdk-dev] [PATCH] app/test: fix mempool test failure on FreeBSD
@ 2021-10-29 8:40 Dmitry Kozlyuk
2021-10-29 9:34 ` Olivier Matz
2021-11-01 7:36 ` [dpdk-dev] [PATCH v2 0/3] Mempool fixes for FreeBSD Dmitry Kozlyuk
0 siblings, 2 replies; 13+ messages in thread
From: Dmitry Kozlyuk @ 2021-10-29 8:40 UTC (permalink / raw)
To: dev; +Cc: YuX Jiang, Olivier Matz, Andrew Rybchenko
FreeBSD EAL does not implement rte_mem_virt2iova()
that was used in mempool_autotest, causing it to fail:
EAL: Test assert test_mempool_flag_non_io_unset_when_populated_with_valid_iova
line 781 failed: Cannot get IOVA
test failed at test_mempool():1030
Test Failed
Change unit test to use rte_memzone_reserve() to allocate memory,
which allows to obtain IOVA directly.
Bugzilla ID: 863
Fixes: 11541c5c81dd ("mempool: add non-IO flag")
Reported-by: YuX Jiang <yux.jiang@intel.com>
Signed-off-by: Dmitry Kozlyuk <dkozlyuk@nvidia.com>
---
app/test/test_mempool.c | 28 +++++++++++++++-------------
1 file changed, 15 insertions(+), 13 deletions(-)
diff --git a/app/test/test_mempool.c b/app/test/test_mempool.c
index 4b0f6b0e7f..bce073064a 100644
--- a/app/test/test_mempool.c
+++ b/app/test/test_mempool.c
@@ -740,16 +740,17 @@ test_mempool_events_safety(void)
static int
test_mempool_flag_non_io_set_when_no_iova_contig_set(void)
{
- void *virt = NULL;
+ 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;
- virt = rte_malloc("test_mempool", 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", 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);
@@ -772,14 +773,15 @@ test_mempool_flag_non_io_set_when_no_iova_contig_set(void)
ret = TEST_SUCCESS;
exit:
rte_mempool_free(mp);
- rte_free(virt);
+ 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;
@@ -789,12 +791,12 @@ test_mempool_flag_non_io_unset_when_populated_with_valid_iova(void)
/*
* 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.
+ * reqiuring 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);
@@ -827,7 +829,7 @@ test_mempool_flag_non_io_unset_when_populated_with_valid_iova(void)
exit:
rte_mempool_free(mp);
- rte_free(virt);
+ rte_memzone_free(mz);
return ret;
}
--
2.25.1
^ permalink raw reply [flat|nested] 13+ messages in thread
* Re: [dpdk-dev] [PATCH] app/test: fix mempool test failure on FreeBSD
2021-10-29 8:40 [dpdk-dev] [PATCH] app/test: fix mempool test failure on FreeBSD Dmitry Kozlyuk
@ 2021-10-29 9:34 ` Olivier Matz
2021-10-29 9:37 ` Dmitry Kozlyuk
2021-11-01 7:36 ` [dpdk-dev] [PATCH v2 0/3] Mempool fixes for FreeBSD Dmitry Kozlyuk
1 sibling, 1 reply; 13+ messages in thread
From: Olivier Matz @ 2021-10-29 9:34 UTC (permalink / raw)
To: Dmitry Kozlyuk; +Cc: dev, YuX Jiang, Andrew Rybchenko
Hi Dmitry,
On Fri, Oct 29, 2021 at 11:40:50AM +0300, Dmitry Kozlyuk wrote:
> FreeBSD EAL does not implement rte_mem_virt2iova()
> that was used in mempool_autotest, causing it to fail:
>
> EAL: Test assert test_mempool_flag_non_io_unset_when_populated_with_valid_iova
> line 781 failed: Cannot get IOVA
> test failed at test_mempool():1030
> Test Failed
>
> Change unit test to use rte_memzone_reserve() to allocate memory,
> which allows to obtain IOVA directly.
>
> Bugzilla ID: 863
> Fixes: 11541c5c81dd ("mempool: add non-IO flag")
>
> Reported-by: YuX Jiang <yux.jiang@intel.com>
> Signed-off-by: Dmitry Kozlyuk <dkozlyuk@nvidia.com>
Reviewed-by: Olivier Matz <olivier.matz@6wind.com>
However, I launched the test like this and it failed:
$ ./build/app/test/dpdk-test --no-huge -m 512
EAL: Detected CPU lcores: 12
EAL: Detected NUMA nodes: 1
EAL: Detected shared linkage of DPDK
EAL: Multi-process socket /run/user/12489/dpdk/rte/mp_socket
EAL: Selected IOVA mode 'VA'
APP: HPET is not enabled, using TSC as default timer
RTE>>mempool_autotest
(...)
EAL: Test assert test_mempool_events line 585 failed: Failed to populate mempool empty1: Success
test failed at test_mempool():1019
Test Failed
It appears that the failure comes from:
int
rte_mempool_populate_anon(struct rte_mempool *mp)
{
(...)
/* can't use MMAP_LOCKED, it does not exist on BSD */
if (rte_mem_lock(addr, size) < 0) {
=> rte_mem_unmap(addr, size);
return 0;
}
The errno here is 12 (ENOMEM). This is because of the default ulimit for
max locked memory: (kbytes, -l) 65536
If I increase it to 128000, it works.
Would it make sense to decrease the size of the pools so that we don't
reach this limit?
(...)
> @@ -789,12 +791,12 @@ test_mempool_flag_non_io_unset_when_populated_with_valid_iova(void)
> /*
> * 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.
> + * reqiuring it could cause spurious test failures.
nice try :D
^ permalink raw reply [flat|nested] 13+ messages in thread
* Re: [dpdk-dev] [PATCH] app/test: fix mempool test failure on FreeBSD
2021-10-29 9:34 ` Olivier Matz
@ 2021-10-29 9:37 ` Dmitry Kozlyuk
0 siblings, 0 replies; 13+ messages in thread
From: Dmitry Kozlyuk @ 2021-10-29 9:37 UTC (permalink / raw)
To: Olivier Matz; +Cc: dev, YuX Jiang, Andrew Rybchenko
> -----Original Message-----
> From: Olivier Matz <olivier.matz@6wind.com>
> Sent: 29 октября 2021 г. 12:35
> To: Dmitry Kozlyuk <dkozlyuk@nvidia.com>
> Cc: dev@dpdk.org; YuX Jiang <yux.jiang@intel.com>; Andrew Rybchenko
> <andrew.rybchenko@oktetlabs.ru>
> Subject: Re: [PATCH] app/test: fix mempool test failure on FreeBSD
>
> External email: Use caution opening links or attachments
>
>
> Hi Dmitry,
>
> On Fri, Oct 29, 2021 at 11:40:50AM +0300, Dmitry Kozlyuk wrote:
> > FreeBSD EAL does not implement rte_mem_virt2iova()
> > that was used in mempool_autotest, causing it to fail:
> >
> > EAL: Test assert
> test_mempool_flag_non_io_unset_when_populated_with_valid_iova
> > line 781 failed: Cannot get IOVA
> > test failed at test_mempool():1030
> > Test Failed
> >
> > Change unit test to use rte_memzone_reserve() to allocate memory,
> > which allows to obtain IOVA directly.
> >
> > Bugzilla ID: 863
> > Fixes: 11541c5c81dd ("mempool: add non-IO flag")
> >
> > Reported-by: YuX Jiang <yux.jiang@intel.com>
> > Signed-off-by: Dmitry Kozlyuk <dkozlyuk@nvidia.com>
>
> Reviewed-by: Olivier Matz <olivier.matz@6wind.com>
>
> However, I launched the test like this and it failed:
>
> $ ./build/app/test/dpdk-test --no-huge -m 512
> EAL: Detected CPU lcores: 12
> EAL: Detected NUMA nodes: 1
> EAL: Detected shared linkage of DPDK
> EAL: Multi-process socket /run/user/12489/dpdk/rte/mp_socket
> EAL: Selected IOVA mode 'VA'
> APP: HPET is not enabled, using TSC as default timer
> RTE>>mempool_autotest
> (...)
> EAL: Test assert test_mempool_events line 585 failed: Failed to populate
> mempool empty1: Success
> test failed at test_mempool():1019
> Test Failed
>
> It appears that the failure comes from:
>
> int
> rte_mempool_populate_anon(struct rte_mempool *mp)
> {
> (...)
> /* can't use MMAP_LOCKED, it does not exist on BSD */
> if (rte_mem_lock(addr, size) < 0) {
> => rte_mem_unmap(addr, size);
> return 0;
> }
>
> The errno here is 12 (ENOMEM). This is because of the default ulimit for
> max locked memory: (kbytes, -l) 65536
>
> If I increase it to 128000, it works.
>
> Would it make sense to decrease the size of the pools so that we don't
> reach this limit?
Good catch, will send a v2.
> (...)
> > @@ -789,12 +791,12 @@
> test_mempool_flag_non_io_unset_when_populated_with_valid_iova(void)
> > /*
> > * 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.
> > + * reqiuring it could cause spurious test failures.
>
> nice try :D
^ permalink raw reply [flat|nested] 13+ messages in thread
* [dpdk-dev] [PATCH v2 0/3] Mempool fixes for FreeBSD
2021-10-29 8:40 [dpdk-dev] [PATCH] app/test: fix mempool test failure on FreeBSD Dmitry Kozlyuk
2021-10-29 9:34 ` Olivier Matz
@ 2021-11-01 7:36 ` Dmitry Kozlyuk
2021-11-01 7:36 ` [dpdk-dev] [PATCH v2 1/3] eal/freebsd: fix IOVA mode selection Dmitry Kozlyuk
` (3 more replies)
1 sibling, 4 replies; 13+ messages in thread
From: Dmitry Kozlyuk @ 2021-11-01 7:36 UTC (permalink / raw)
To: dev; +Cc: Anatoly Burakov, Olivier Matz, Yu Jiang
mempool_autotest was failing on FreeBSD,
because rte_virt2iova() is not implemented.
After the test started using memzones,
it appeared that in --no-huge memzones have iova=RTE_BAD_IOVA,
which is unexpected and contradicts with selected IOVA-as-PA.
Intead of working around this in the unit test,
fix FreeBSD EAL to select IOVA-as-VA in --no-huge mode.
v2:
* Add the EAL changes.
* Fix a failure with --no-huge (Olivier).
Dmitry Kozlyuk (3):
eal/freebsd: fix IOVA mode selection
app/test: fix mempool test on FreeBSD
app/test: fix mempool test in no-huge mode
app/test/test_mempool.c | 62 ++++++++++++++++++++++-------------------
lib/eal/freebsd/eal.c | 37 ++++++++++++++++--------
2 files changed, 58 insertions(+), 41 deletions(-)
--
2.25.1
^ permalink raw reply [flat|nested] 13+ messages in thread
* [dpdk-dev] [PATCH v2 1/3] eal/freebsd: fix IOVA mode selection
2021-11-01 7:36 ` [dpdk-dev] [PATCH v2 0/3] Mempool fixes for FreeBSD Dmitry Kozlyuk
@ 2021-11-01 7:36 ` Dmitry Kozlyuk
2021-11-01 16:21 ` Bruce Richardson
2021-11-01 7:37 ` [dpdk-dev] [PATCH v2 2/3] app/test: fix mempool test on FreeBSD Dmitry Kozlyuk
` (2 subsequent siblings)
3 siblings, 1 reply; 13+ messages in thread
From: Dmitry Kozlyuk @ 2021-11-01 7:36 UTC (permalink / raw)
To: dev; +Cc: Anatoly Burakov, benjamin.walker, stable, Bruce Richardson
FreeBSD EAL selected IOVA mode PA even in --no-huge mode
where PA are not available. Memory zones were created with IOVA
equal to RTE_BAD_IOVA with no indication this field is not usable.
Change IOVA mode detection:
1. Always allow to force --iova-mode=va.
2. In --no-huge mode, disallow forcing --iova-mode=pa, and select VA.
3. Otherwise select IOVA mode according to bus requests, default to PA.
In case contigmem is inaccessible, memory initialization will fail
with a message indicating the cause.
Fixes: c2361bab70c5 ("eal: compute IOVA mode based on PA availability")
Cc: benjamin.walker@intel.com
Cc: stable@dpdk.org
Signed-off-by: Dmitry Kozlyuk <dkozlyuk@nvidia.com>
---
lib/eal/freebsd/eal.c | 37 +++++++++++++++++++++++++------------
1 file changed, 25 insertions(+), 12 deletions(-)
diff --git a/lib/eal/freebsd/eal.c b/lib/eal/freebsd/eal.c
index 9935356ed4..519a645344 100644
--- a/lib/eal/freebsd/eal.c
+++ b/lib/eal/freebsd/eal.c
@@ -677,6 +677,8 @@ rte_eal_init(int argc, char **argv)
const struct rte_config *config = rte_eal_get_configuration();
struct internal_config *internal_conf =
eal_get_internal_configuration();
+ bool has_phys_addr;
+ enum rte_iova_mode iova_mode;
/* checks if the machine is adequate */
if (!rte_cpu_is_supported()) {
@@ -777,21 +779,32 @@ rte_eal_init(int argc, char **argv)
return -1;
}
- /* if no EAL option "--iova-mode=<pa|va>", use bus IOVA scheme */
- if (internal_conf->iova_mode == RTE_IOVA_DC) {
- /* autodetect the IOVA mapping mode (default is RTE_IOVA_PA) */
- enum rte_iova_mode iova_mode = rte_bus_get_iommu_class();
-
- if (iova_mode == RTE_IOVA_DC)
- iova_mode = RTE_IOVA_PA;
- rte_eal_get_configuration()->iova_mode = iova_mode;
- } else {
- rte_eal_get_configuration()->iova_mode =
- internal_conf->iova_mode;
+ /*
+ * PA are only available for hugepages via contigmem.
+ * If contigmem is inaccessible, rte_eal_hugepage_init() will fail
+ * with a message describing the cause.
+ */
+ has_phys_addr = internal_conf->no_hugetlbfs == 0;
+ iova_mode = internal_conf->iova_mode;
+ if (iova_mode == RTE_IOVA_PA && !has_phys_addr) {
+ rte_eal_init_alert("Cannot use IOVA as 'PA' since physical addresses are not available");
+ rte_errno = EINVAL;
+ return -1;
+ }
+ if (iova_mode == RTE_IOVA_DC) {
+ RTE_LOG(DEBUG, EAL, "Specific IOVA mode is not requested, autodetecting\n");
+ if (has_phys_addr) {
+ RTE_LOG(DEBUG, EAL, "Selecting IOVA mode according to bus requests\n");
+ iova_mode = rte_bus_get_iommu_class();
+ if (iova_mode == RTE_IOVA_DC)
+ iova_mode = RTE_IOVA_PA;
+ } else {
+ iova_mode = RTE_IOVA_VA;
+ }
}
-
RTE_LOG(INFO, EAL, "Selected IOVA mode '%s'\n",
rte_eal_iova_mode() == RTE_IOVA_PA ? "PA" : "VA");
+ rte_eal_get_configuration()->iova_mode = iova_mode;
if (internal_conf->no_hugetlbfs == 0) {
/* rte_config isn't initialized yet */
--
2.25.1
^ permalink raw reply [flat|nested] 13+ messages in thread
* [dpdk-dev] [PATCH v2 2/3] app/test: fix mempool test on FreeBSD
2021-11-01 7:36 ` [dpdk-dev] [PATCH v2 0/3] Mempool fixes for FreeBSD Dmitry Kozlyuk
2021-11-01 7:36 ` [dpdk-dev] [PATCH v2 1/3] eal/freebsd: fix IOVA mode selection Dmitry Kozlyuk
@ 2021-11-01 7:37 ` Dmitry Kozlyuk
2021-11-01 7:37 ` [dpdk-dev] [PATCH v2 3/3] app/test: fix mempool test in no-huge mode Dmitry Kozlyuk
2021-11-02 10:08 ` [dpdk-dev] [PATCH v3 0/3] Mempool fixes for FreeBSD Dmitry Kozlyuk
3 siblings, 0 replies; 13+ messages in thread
From: Dmitry Kozlyuk @ 2021-11-01 7:37 UTC (permalink / raw)
To: dev; +Cc: Yu Jiang, Olivier Matz, Andrew Rybchenko
FreeBSD EAL does not implement rte_mem_virt2iova() causing an error:
EAL: Test assert test_mempool_flag_non_io_unset_when_populated_with_valid_iova
line 781 failed: Cannot get IOVA
test failed at test_mempool():1030
Test Failed
Change unit test to use rte_memzone_reserve() to allocate memory,
which allows to obtain IOVA directly.
Bugzilla ID: 863
Fixes: 11541c5c81dd ("mempool: add non-IO flag")
Reported-by: Yu Jiang <yux.jiang@intel.com>
Signed-off-by: Dmitry Kozlyuk <dkozlyuk@nvidia.com>
---
app/test/test_mempool.c | 28 +++++++++++++++-------------
1 file changed, 15 insertions(+), 13 deletions(-)
diff --git a/app/test/test_mempool.c b/app/test/test_mempool.c
index 4b0f6b0e7f..ced20dcdc3 100644
--- a/app/test/test_mempool.c
+++ b/app/test/test_mempool.c
@@ -740,16 +740,17 @@ test_mempool_events_safety(void)
static int
test_mempool_flag_non_io_set_when_no_iova_contig_set(void)
{
- void *virt = NULL;
+ 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;
- virt = rte_malloc("test_mempool", 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", 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);
@@ -772,14 +773,15 @@ test_mempool_flag_non_io_set_when_no_iova_contig_set(void)
ret = TEST_SUCCESS;
exit:
rte_mempool_free(mp);
- rte_free(virt);
+ 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;
@@ -789,12 +791,12 @@ test_mempool_flag_non_io_unset_when_populated_with_valid_iova(void)
/*
* 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);
@@ -827,7 +829,7 @@ test_mempool_flag_non_io_unset_when_populated_with_valid_iova(void)
exit:
rte_mempool_free(mp);
- rte_free(virt);
+ rte_memzone_free(mz);
return ret;
}
--
2.25.1
^ permalink raw reply [flat|nested] 13+ messages in thread
* [dpdk-dev] [PATCH v2 3/3] app/test: fix mempool test in no-huge mode
2021-11-01 7:36 ` [dpdk-dev] [PATCH v2 0/3] Mempool fixes for FreeBSD Dmitry Kozlyuk
2021-11-01 7:36 ` [dpdk-dev] [PATCH v2 1/3] eal/freebsd: fix IOVA mode selection Dmitry Kozlyuk
2021-11-01 7:37 ` [dpdk-dev] [PATCH v2 2/3] app/test: fix mempool test on FreeBSD Dmitry Kozlyuk
@ 2021-11-01 7:37 ` Dmitry Kozlyuk
2021-11-02 10:08 ` [dpdk-dev] [PATCH v3 0/3] Mempool fixes for FreeBSD Dmitry Kozlyuk
3 siblings, 0 replies; 13+ messages in thread
From: Dmitry Kozlyuk @ 2021-11-01 7:37 UTC (permalink / raw)
To: dev; +Cc: Olivier Matz, Andrew Rybchenko
Amount of locked memory for regular users is limited,
it is usually 64 KB by default.
Hitting this limit in rte_mempool_populate_anon()
resulted in not populating the mempool, and a test case failure:
EAL: Test assert test_mempool_events line 585 failed: Failed to populate mempool empty1: Success
test failed at test_mempool():1019
Test Failed
Decrease the amount of mapped anonymous memory to fit the limit.
While there, make all function-local constants lowercase.
Fixes: 11541c5c81dd ("mempool: add non-IO flag")
Reported-by: Olivier Matz <olivier.matz@6wind.com>
Signed-off-by: Dmitry Kozlyuk <dkozlyuk@nvidia.com>
---
app/test/test_mempool.c | 34 ++++++++++++++++++----------------
1 file changed, 18 insertions(+), 16 deletions(-)
diff --git a/app/test/test_mempool.c b/app/test/test_mempool.c
index ced20dcdc3..a451608558 100644
--- a/app/test/test_mempool.c
+++ b/app/test/test_mempool.c
@@ -515,17 +515,19 @@ test_mempool_events(int (*populate)(struct rte_mempool *mp))
#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",
@@ -541,12 +543,12 @@ test_mempool_events(int (*populate)(struct rte_mempool *mp))
/* 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);
@@ -555,7 +557,7 @@ test_mempool_events(int (*populate)(struct rte_mempool *mp))
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);
@@ -574,8 +576,8 @@ test_mempool_events(int (*populate)(struct rte_mempool *mp))
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));
@@ -587,7 +589,7 @@ test_mempool_events(int (*populate)(struct rte_mempool *mp))
"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]);
@@ -597,7 +599,7 @@ test_mempool_events(int (*populate)(struct rte_mempool *mp))
*/
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);
@@ -613,7 +615,7 @@ test_mempool_events(int (*populate)(struct rte_mempool *mp))
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",
@@ -622,10 +624,10 @@ test_mempool_events(int (*populate)(struct rte_mempool *mp))
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;
--
2.25.1
^ permalink raw reply [flat|nested] 13+ messages in thread
* Re: [dpdk-dev] [PATCH v2 1/3] eal/freebsd: fix IOVA mode selection
2021-11-01 7:36 ` [dpdk-dev] [PATCH v2 1/3] eal/freebsd: fix IOVA mode selection Dmitry Kozlyuk
@ 2021-11-01 16:21 ` Bruce Richardson
0 siblings, 0 replies; 13+ messages in thread
From: Bruce Richardson @ 2021-11-01 16:21 UTC (permalink / raw)
To: Dmitry Kozlyuk; +Cc: dev, Anatoly Burakov, benjamin.walker, stable
On Mon, Nov 01, 2021 at 09:36:59AM +0200, Dmitry Kozlyuk wrote:
> FreeBSD EAL selected IOVA mode PA even in --no-huge mode
> where PA are not available. Memory zones were created with IOVA
> equal to RTE_BAD_IOVA with no indication this field is not usable.
>
> Change IOVA mode detection:
> 1. Always allow to force --iova-mode=va.
> 2. In --no-huge mode, disallow forcing --iova-mode=pa, and select VA.
> 3. Otherwise select IOVA mode according to bus requests, default to PA.
> In case contigmem is inaccessible, memory initialization will fail
> with a message indicating the cause.
>
> Fixes: c2361bab70c5 ("eal: compute IOVA mode based on PA availability")
> Cc: benjamin.walker@intel.com
> Cc: stable@dpdk.org
>
> Signed-off-by: Dmitry Kozlyuk <dkozlyuk@nvidia.com>
> ---
> lib/eal/freebsd/eal.c | 37 +++++++++++++++++++++++++------------
> 1 file changed, 25 insertions(+), 12 deletions(-)
>
> diff --git a/lib/eal/freebsd/eal.c b/lib/eal/freebsd/eal.c
> index 9935356ed4..519a645344 100644
> --- a/lib/eal/freebsd/eal.c
> +++ b/lib/eal/freebsd/eal.c
> @@ -677,6 +677,8 @@ rte_eal_init(int argc, char **argv)
> const struct rte_config *config = rte_eal_get_configuration();
> struct internal_config *internal_conf =
> eal_get_internal_configuration();
> + bool has_phys_addr;
> + enum rte_iova_mode iova_mode;
>
> /* checks if the machine is adequate */
> if (!rte_cpu_is_supported()) {
> @@ -777,21 +779,32 @@ rte_eal_init(int argc, char **argv)
> return -1;
> }
>
> - /* if no EAL option "--iova-mode=<pa|va>", use bus IOVA scheme */
> - if (internal_conf->iova_mode == RTE_IOVA_DC) {
> - /* autodetect the IOVA mapping mode (default is RTE_IOVA_PA) */
> - enum rte_iova_mode iova_mode = rte_bus_get_iommu_class();
> -
> - if (iova_mode == RTE_IOVA_DC)
> - iova_mode = RTE_IOVA_PA;
> - rte_eal_get_configuration()->iova_mode = iova_mode;
> - } else {
> - rte_eal_get_configuration()->iova_mode =
> - internal_conf->iova_mode;
> + /*
> + * PA are only available for hugepages via contigmem.
> + * If contigmem is inaccessible, rte_eal_hugepage_init() will fail
> + * with a message describing the cause.
> + */
> + has_phys_addr = internal_conf->no_hugetlbfs == 0;
> + iova_mode = internal_conf->iova_mode;
> + if (iova_mode == RTE_IOVA_PA && !has_phys_addr) {
> + rte_eal_init_alert("Cannot use IOVA as 'PA' since physical addresses are not available");
> + rte_errno = EINVAL;
> + return -1;
> + }
> + if (iova_mode == RTE_IOVA_DC) {
> + RTE_LOG(DEBUG, EAL, "Specific IOVA mode is not requested, autodetecting\n");
> + if (has_phys_addr) {
> + RTE_LOG(DEBUG, EAL, "Selecting IOVA mode according to bus requests\n");
> + iova_mode = rte_bus_get_iommu_class();
> + if (iova_mode == RTE_IOVA_DC)
> + iova_mode = RTE_IOVA_PA;
> + } else {
> + iova_mode = RTE_IOVA_VA;
> + }
> }
> -
> RTE_LOG(INFO, EAL, "Selected IOVA mode '%s'\n",
> rte_eal_iova_mode() == RTE_IOVA_PA ? "PA" : "VA");
> + rte_eal_get_configuration()->iova_mode = iova_mode;
>
This line needs to come before the log, or else the log statement needs to
be changed to use iova_mode rather than rte_eal_iova_mode(). I'd suggest
the former option.
With that change, you can add my ack to v2:
Acked-by: Bruce Richardson <bruce.richardson@intel.com>
^ permalink raw reply [flat|nested] 13+ messages in thread
* [dpdk-dev] [PATCH v3 0/3] Mempool fixes for FreeBSD
2021-11-01 7:36 ` [dpdk-dev] [PATCH v2 0/3] Mempool fixes for FreeBSD Dmitry Kozlyuk
` (2 preceding siblings ...)
2021-11-01 7:37 ` [dpdk-dev] [PATCH v2 3/3] app/test: fix mempool test in no-huge mode Dmitry Kozlyuk
@ 2021-11-02 10:08 ` Dmitry Kozlyuk
2021-11-02 10:08 ` [dpdk-dev] [PATCH v3 1/3] eal/freebsd: fix IOVA mode selection Dmitry Kozlyuk
` (3 more replies)
3 siblings, 4 replies; 13+ messages in thread
From: Dmitry Kozlyuk @ 2021-11-02 10:08 UTC (permalink / raw)
To: dev; +Cc: Anatoly Burakov, Olivier Matz, Yu Jiang
mempool_autotest was failing on FreeBSD,
because rte_virt2iova() is not implemented.
After the test started using memzones,
it appeared that in --no-huge memzones have iova=RTE_BAD_IOVA,
which is unexpected and contradicts with selected IOVA-as-PA.
Intead of working around this in the unit test,
fix FreeBSD EAL to select IOVA-as-VA in --no-huge mode.
v3:
* Fix IOVA mode logging (Bruce).
v2:
* Add the EAL changes.
* Fix a failure with --no-huge (Olivier).
Dmitry Kozlyuk (3):
eal/freebsd: fix IOVA mode selection
app/test: fix mempool test on FreeBSD
app/test: fix mempool test in no-huge mode
app/test/test_mempool.c | 62 ++++++++++++++++++++++-------------------
lib/eal/freebsd/eal.c | 37 ++++++++++++++++--------
2 files changed, 58 insertions(+), 41 deletions(-)
--
2.25.1
^ permalink raw reply [flat|nested] 13+ messages in thread
* [dpdk-dev] [PATCH v3 1/3] eal/freebsd: fix IOVA mode selection
2021-11-02 10:08 ` [dpdk-dev] [PATCH v3 0/3] Mempool fixes for FreeBSD Dmitry Kozlyuk
@ 2021-11-02 10:08 ` Dmitry Kozlyuk
2021-11-02 10:08 ` [dpdk-dev] [PATCH v3 2/3] app/test: fix mempool test on FreeBSD Dmitry Kozlyuk
` (2 subsequent siblings)
3 siblings, 0 replies; 13+ messages in thread
From: Dmitry Kozlyuk @ 2021-11-02 10:08 UTC (permalink / raw)
To: dev; +Cc: benjamin.walker, stable, Bruce Richardson
FreeBSD EAL selected IOVA mode PA even in --no-huge mode
where PA are not available. Memory zones were created with IOVA
equal to RTE_BAD_IOVA with no indication this field is not usable.
Change IOVA mode detection:
1. Always allow to force --iova-mode=va.
2. In --no-huge mode, disallow forcing --iova-mode=pa, and select VA.
3. Otherwise select IOVA mode according to bus requests, default to PA.
In case contigmem is inaccessible, memory initialization will fail
with a message indicating the cause.
Fixes: c2361bab70c5 ("eal: compute IOVA mode based on PA availability")
Cc: benjamin.walker@intel.com
Cc: stable@dpdk.org
Signed-off-by: Dmitry Kozlyuk <dkozlyuk@nvidia.com>
Acked-by: Bruce Richardson <bruce.richardson@intel.com>
---
lib/eal/freebsd/eal.c | 37 +++++++++++++++++++++++++------------
1 file changed, 25 insertions(+), 12 deletions(-)
diff --git a/lib/eal/freebsd/eal.c b/lib/eal/freebsd/eal.c
index 9935356ed4..2c2baaa691 100644
--- a/lib/eal/freebsd/eal.c
+++ b/lib/eal/freebsd/eal.c
@@ -677,6 +677,8 @@ rte_eal_init(int argc, char **argv)
const struct rte_config *config = rte_eal_get_configuration();
struct internal_config *internal_conf =
eal_get_internal_configuration();
+ bool has_phys_addr;
+ enum rte_iova_mode iova_mode;
/* checks if the machine is adequate */
if (!rte_cpu_is_supported()) {
@@ -777,19 +779,30 @@ rte_eal_init(int argc, char **argv)
return -1;
}
- /* if no EAL option "--iova-mode=<pa|va>", use bus IOVA scheme */
- if (internal_conf->iova_mode == RTE_IOVA_DC) {
- /* autodetect the IOVA mapping mode (default is RTE_IOVA_PA) */
- enum rte_iova_mode iova_mode = rte_bus_get_iommu_class();
-
- if (iova_mode == RTE_IOVA_DC)
- iova_mode = RTE_IOVA_PA;
- rte_eal_get_configuration()->iova_mode = iova_mode;
- } else {
- rte_eal_get_configuration()->iova_mode =
- internal_conf->iova_mode;
+ /*
+ * PA are only available for hugepages via contigmem.
+ * If contigmem is inaccessible, rte_eal_hugepage_init() will fail
+ * with a message describing the cause.
+ */
+ has_phys_addr = internal_conf->no_hugetlbfs == 0;
+ iova_mode = internal_conf->iova_mode;
+ if (iova_mode == RTE_IOVA_PA && !has_phys_addr) {
+ rte_eal_init_alert("Cannot use IOVA as 'PA' since physical addresses are not available");
+ rte_errno = EINVAL;
+ return -1;
}
-
+ if (iova_mode == RTE_IOVA_DC) {
+ RTE_LOG(DEBUG, EAL, "Specific IOVA mode is not requested, autodetecting\n");
+ if (has_phys_addr) {
+ RTE_LOG(DEBUG, EAL, "Selecting IOVA mode according to bus requests\n");
+ iova_mode = rte_bus_get_iommu_class();
+ if (iova_mode == RTE_IOVA_DC)
+ iova_mode = RTE_IOVA_PA;
+ } else {
+ iova_mode = RTE_IOVA_VA;
+ }
+ }
+ rte_eal_get_configuration()->iova_mode = iova_mode;
RTE_LOG(INFO, EAL, "Selected IOVA mode '%s'\n",
rte_eal_iova_mode() == RTE_IOVA_PA ? "PA" : "VA");
--
2.25.1
^ permalink raw reply [flat|nested] 13+ messages in thread
* [dpdk-dev] [PATCH v3 2/3] app/test: fix mempool test on FreeBSD
2021-11-02 10:08 ` [dpdk-dev] [PATCH v3 0/3] Mempool fixes for FreeBSD Dmitry Kozlyuk
2021-11-02 10:08 ` [dpdk-dev] [PATCH v3 1/3] eal/freebsd: fix IOVA mode selection Dmitry Kozlyuk
@ 2021-11-02 10:08 ` Dmitry Kozlyuk
2021-11-02 10:08 ` [dpdk-dev] [PATCH v3 3/3] app/test: fix mempool test in no-huge mode Dmitry Kozlyuk
2021-11-03 17:39 ` [dpdk-dev] [PATCH v3 0/3] Mempool fixes for FreeBSD Thomas Monjalon
3 siblings, 0 replies; 13+ messages in thread
From: Dmitry Kozlyuk @ 2021-11-02 10:08 UTC (permalink / raw)
To: dev; +Cc: Yu Jiang, Olivier Matz, Andrew Rybchenko
FreeBSD EAL does not implement rte_mem_virt2iova() causing an error:
EAL: Test assert test_mempool_flag_non_io_unset_when_populated_with_valid_iova
line 781 failed: Cannot get IOVA
test failed at test_mempool():1030
Test Failed
Change unit test to use rte_memzone_reserve() to allocate memory,
which allows to obtain IOVA directly.
Bugzilla ID: 863
Fixes: 11541c5c81dd ("mempool: add non-IO flag")
Reported-by: Yu Jiang <yux.jiang@intel.com>
Signed-off-by: Dmitry Kozlyuk <dkozlyuk@nvidia.com>
---
app/test/test_mempool.c | 28 +++++++++++++++-------------
1 file changed, 15 insertions(+), 13 deletions(-)
diff --git a/app/test/test_mempool.c b/app/test/test_mempool.c
index 4b0f6b0e7f..ced20dcdc3 100644
--- a/app/test/test_mempool.c
+++ b/app/test/test_mempool.c
@@ -740,16 +740,17 @@ test_mempool_events_safety(void)
static int
test_mempool_flag_non_io_set_when_no_iova_contig_set(void)
{
- void *virt = NULL;
+ 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;
- virt = rte_malloc("test_mempool", 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", 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);
@@ -772,14 +773,15 @@ test_mempool_flag_non_io_set_when_no_iova_contig_set(void)
ret = TEST_SUCCESS;
exit:
rte_mempool_free(mp);
- rte_free(virt);
+ 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;
@@ -789,12 +791,12 @@ test_mempool_flag_non_io_unset_when_populated_with_valid_iova(void)
/*
* 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);
@@ -827,7 +829,7 @@ test_mempool_flag_non_io_unset_when_populated_with_valid_iova(void)
exit:
rte_mempool_free(mp);
- rte_free(virt);
+ rte_memzone_free(mz);
return ret;
}
--
2.25.1
^ permalink raw reply [flat|nested] 13+ messages in thread
* [dpdk-dev] [PATCH v3 3/3] app/test: fix mempool test in no-huge mode
2021-11-02 10:08 ` [dpdk-dev] [PATCH v3 0/3] Mempool fixes for FreeBSD Dmitry Kozlyuk
2021-11-02 10:08 ` [dpdk-dev] [PATCH v3 1/3] eal/freebsd: fix IOVA mode selection Dmitry Kozlyuk
2021-11-02 10:08 ` [dpdk-dev] [PATCH v3 2/3] app/test: fix mempool test on FreeBSD Dmitry Kozlyuk
@ 2021-11-02 10:08 ` Dmitry Kozlyuk
2021-11-03 17:39 ` [dpdk-dev] [PATCH v3 0/3] Mempool fixes for FreeBSD Thomas Monjalon
3 siblings, 0 replies; 13+ messages in thread
From: Dmitry Kozlyuk @ 2021-11-02 10:08 UTC (permalink / raw)
To: dev; +Cc: Olivier Matz, Andrew Rybchenko
Amount of locked memory for regular users is limited,
it is usually 64 KB by default.
Hitting this limit in rte_mempool_populate_anon()
resulted in not populating the mempool, and a test case failure:
EAL: Test assert test_mempool_events line 585 failed: Failed to populate mempool empty1: Success
test failed at test_mempool():1019
Test Failed
Decrease the amount of mapped anonymous memory to fit the limit.
While there, make all function-local constants lowercase.
Fixes: 11541c5c81dd ("mempool: add non-IO flag")
Reported-by: Olivier Matz <olivier.matz@6wind.com>
Signed-off-by: Dmitry Kozlyuk <dkozlyuk@nvidia.com>
---
app/test/test_mempool.c | 34 ++++++++++++++++++----------------
1 file changed, 18 insertions(+), 16 deletions(-)
diff --git a/app/test/test_mempool.c b/app/test/test_mempool.c
index ced20dcdc3..a451608558 100644
--- a/app/test/test_mempool.c
+++ b/app/test/test_mempool.c
@@ -515,17 +515,19 @@ test_mempool_events(int (*populate)(struct rte_mempool *mp))
#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",
@@ -541,12 +543,12 @@ test_mempool_events(int (*populate)(struct rte_mempool *mp))
/* 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);
@@ -555,7 +557,7 @@ test_mempool_events(int (*populate)(struct rte_mempool *mp))
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);
@@ -574,8 +576,8 @@ test_mempool_events(int (*populate)(struct rte_mempool *mp))
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));
@@ -587,7 +589,7 @@ test_mempool_events(int (*populate)(struct rte_mempool *mp))
"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]);
@@ -597,7 +599,7 @@ test_mempool_events(int (*populate)(struct rte_mempool *mp))
*/
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);
@@ -613,7 +615,7 @@ test_mempool_events(int (*populate)(struct rte_mempool *mp))
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",
@@ -622,10 +624,10 @@ test_mempool_events(int (*populate)(struct rte_mempool *mp))
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;
--
2.25.1
^ permalink raw reply [flat|nested] 13+ messages in thread
* Re: [dpdk-dev] [PATCH v3 0/3] Mempool fixes for FreeBSD
2021-11-02 10:08 ` [dpdk-dev] [PATCH v3 0/3] Mempool fixes for FreeBSD Dmitry Kozlyuk
` (2 preceding siblings ...)
2021-11-02 10:08 ` [dpdk-dev] [PATCH v3 3/3] app/test: fix mempool test in no-huge mode Dmitry Kozlyuk
@ 2021-11-03 17:39 ` Thomas Monjalon
3 siblings, 0 replies; 13+ messages in thread
From: Thomas Monjalon @ 2021-11-03 17:39 UTC (permalink / raw)
To: Dmitry Kozlyuk; +Cc: dev, Anatoly Burakov, Olivier Matz, Yu Jiang
02/11/2021 11:08, Dmitry Kozlyuk:
> mempool_autotest was failing on FreeBSD,
> because rte_virt2iova() is not implemented.
> After the test started using memzones,
> it appeared that in --no-huge memzones have iova=RTE_BAD_IOVA,
> which is unexpected and contradicts with selected IOVA-as-PA.
> Intead of working around this in the unit test,
> fix FreeBSD EAL to select IOVA-as-VA in --no-huge mode.
>
> v3:
> * Fix IOVA mode logging (Bruce).
> v2:
> * Add the EAL changes.
> * Fix a failure with --no-huge (Olivier).
>
> Dmitry Kozlyuk (3):
> eal/freebsd: fix IOVA mode selection
> app/test: fix mempool test on FreeBSD
> app/test: fix mempool test in no-huge mode
Series applied, thanks.
^ permalink raw reply [flat|nested] 13+ messages in thread
end of thread, other threads:[~2021-11-03 17:39 UTC | newest]
Thread overview: 13+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2021-10-29 8:40 [dpdk-dev] [PATCH] app/test: fix mempool test failure on FreeBSD Dmitry Kozlyuk
2021-10-29 9:34 ` Olivier Matz
2021-10-29 9:37 ` Dmitry Kozlyuk
2021-11-01 7:36 ` [dpdk-dev] [PATCH v2 0/3] Mempool fixes for FreeBSD Dmitry Kozlyuk
2021-11-01 7:36 ` [dpdk-dev] [PATCH v2 1/3] eal/freebsd: fix IOVA mode selection Dmitry Kozlyuk
2021-11-01 16:21 ` Bruce Richardson
2021-11-01 7:37 ` [dpdk-dev] [PATCH v2 2/3] app/test: fix mempool test on FreeBSD Dmitry Kozlyuk
2021-11-01 7:37 ` [dpdk-dev] [PATCH v2 3/3] app/test: fix mempool test in no-huge mode Dmitry Kozlyuk
2021-11-02 10:08 ` [dpdk-dev] [PATCH v3 0/3] Mempool fixes for FreeBSD Dmitry Kozlyuk
2021-11-02 10:08 ` [dpdk-dev] [PATCH v3 1/3] eal/freebsd: fix IOVA mode selection Dmitry Kozlyuk
2021-11-02 10:08 ` [dpdk-dev] [PATCH v3 2/3] app/test: fix mempool test on FreeBSD Dmitry Kozlyuk
2021-11-02 10:08 ` [dpdk-dev] [PATCH v3 3/3] app/test: fix mempool test in no-huge mode Dmitry Kozlyuk
2021-11-03 17:39 ` [dpdk-dev] [PATCH v3 0/3] Mempool fixes for FreeBSD Thomas Monjalon
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).