mempool: use actual IOVA addresses when populating
authorAnatoly Burakov <anatoly.burakov@intel.com>
Thu, 14 Nov 2019 13:58:20 +0000 (13:58 +0000)
committerDavid Marchand <david.marchand@redhat.com>
Tue, 19 Nov 2019 20:41:43 +0000 (21:41 +0100)
commit2a7fd3ef38da19b2805fecd29c527456364ae618
tree6bd3ad6ba2b9a6c2a4f5141d43633686b061d6ce
parenta0dede62a5372da0a9b67859962e64108a10b916
mempool: use actual IOVA addresses when populating

Currently, when mempool is being populated, we get IOVA address
of every segment using rte_mem_virt2iova(). This works for internal
memory, but does not really work for external memory, and does not
work on platforms which return RTE_BAD_IOVA as a result of this
call (such as FreeBSD). Moreover, even when it works, the function
in question will do unnecessary pagewalks in IOVA as PA mode, as
it falls back to rte_mem_virt2phy() instead of just doing a lookup in
internal memseg table.

To fix it, replace the call to first attempt to look through the
internal memseg table (this takes care of internal and external memory),
and fall back to rte_mem_virt2iova() when unable to perform VA->IOVA
translation via memseg table.

Fixes: 66cc45e293ed ("mem: replace memseg with memseg lists")
Cc: stable@dpdk.org
Signed-off-by: Anatoly Burakov <anatoly.burakov@intel.com>
Acked-by: Olivier Matz <olivier.matz@6wind.com>
Tested-by: Bo Chen <box.c.chen@intel.com>
lib/librte_mempool/rte_mempool.c