On Sunday 01 April 2018 05:56 PM, Anatoly Burakov wrote: > We already use VA addresses for IOVA purposes everywhere if we're in > RTE_IOVA_VA mode: > 1) rte_malloc_virt2phy()/rte_malloc_virt2iova() always return VA addresses > 2) Because of 1), memzone's IOVA is set to VA address on reserve > 3) Because of 2), mempool's IOVA addresses are set to VA addresses > > The only place where actual physical addresses are stored is in memsegs at > init time, but we're not using them anywhere, and there is no external API > to get those addresses (aside from manually iterating through memsegs), nor > should anyone care about them in RTE_IOVA_VA mode. > > So, fix EAL initialization to allocate VA-contiguous segments at the start > without regard for physical addresses (as if they weren't available), and > use VA to set final IOVA addresses for all pages. > > Fixes: 62196f4e0941 ("mem: rename address mapping function to IOVA") > Cc: tho...@monjalon.net > Cc: sta...@dpdk.org > > Signed-off-by: Anatoly Burakov <anatoly.bura...@intel.com> > --- > lib/librte_eal/linuxapp/eal/eal_memory.c | 6 +++++- > 1 file changed, 5 insertions(+), 1 deletion(-) > > diff --git a/lib/librte_eal/linuxapp/eal/eal_memory.c > b/lib/librte_eal/linuxapp/eal/eal_memory.c > index 38853b7..ecf375b 100644 > --- a/lib/librte_eal/linuxapp/eal/eal_memory.c > +++ b/lib/librte_eal/linuxapp/eal/eal_memory.c > @@ -473,6 +473,9 @@ map_all_hugepages(struct hugepage_file *hugepg_tbl, > struct hugepage_info *hpi, > hugepg_tbl[i].orig_va = virtaddr; > } > else { > + /* rewrite physical addresses in IOVA as VA mode */ > + if (rte_eal_iova_mode() == RTE_IOVA_VA) > + hugepg_tbl[i].physaddr = (uintptr_t)virtaddr; > hugepg_tbl[i].final_va = virtaddr; > } > > @@ -1091,7 +1094,8 @@ rte_eal_hugepage_init(void) > continue; > } > > - if (phys_addrs_available) { > + if (phys_addrs_available && > + rte_eal_iova_mode() != RTE_IOVA_VA) {
Also can be done like below: if (phys_addrs_available) /* find physical addresses for each hugepage */ if (find_iovaaddrs(&tmp_hp[hp_offset], hpi) < 0) { such that; find_iovaaddrs() --> rte_mem_virt2iova(). That way avoid iova check in above if loop. does that make sense? Thanks. [...]