On Fri, Jun 9, 2017 at 10:29 AM, Olivier Matz <olivier.m...@6wind.com> wrote: > When populating a mempool with a virtual memory area, the mempool > library expects to be able to get the physical address of each page. > > When started with --no-huge, the physical addresses may not be available > because the pages are not locked in memory. It sometimes returns > RTE_BAD_PHYS_ADDR, which makes the mempool_populate() function to fail. > > This was working before the commit cdc242f260e7 ("eal/linux: support > running as unprivileged user"), because rte_mem_virt2phy() was returning > 0 instead of RTE_BAD_PHYS_ADDR, which was seen as a valid physical > address. > > Since --no-huge is a debug function that breaks the support of physical > drivers, always set physical addresses to RTE_BAD_PHYS_ADDR in memzones > or in rte_mem_virt2phy(), and ensure that mempool won't complain in that > case. > > Fixes: cdc242f260e7 ("eal/linux: support running as unprivileged user") > > CC: sta...@dpdk.org > Signed-off-by: Olivier Matz <olivier.m...@6wind.com> > --- > lib/librte_eal/common/eal_common_memzone.c | 5 ++++- > lib/librte_eal/linuxapp/eal/eal_memory.c | 7 +++++++ > lib/librte_mempool/rte_mempool.c | 2 +- > 3 files changed, 12 insertions(+), 2 deletions(-) > > diff --git a/lib/librte_eal/common/eal_common_memzone.c > b/lib/librte_eal/common/eal_common_memzone.c > index 3026e36b8..c465c8fc2 100644 > --- a/lib/librte_eal/common/eal_common_memzone.c > +++ b/lib/librte_eal/common/eal_common_memzone.c > @@ -251,7 +251,10 @@ memzone_reserve_aligned_thread_unsafe(const char *name, > size_t len, > > mcfg->memzone_cnt++; > snprintf(mz->name, sizeof(mz->name), "%s", name); > - mz->phys_addr = rte_malloc_virt2phy(mz_addr); > + if (rte_eal_has_hugepages()) > + mz->phys_addr = rte_malloc_virt2phy(mz_addr); > + else > + mz->phys_addr = RTE_BAD_PHYS_ADDR;
Since you set phys_addrs_available to false rte_malloc_virt2phy() anyway returns RTE_BAD_PHYS_ADDR so I believe the conditional isn't necessary here. Rest of the patch looks good to me. > mz->addr = mz_addr; > mz->len = (requested_len == 0 ? elem->size : requested_len); > mz->hugepage_sz = elem->ms->hugepage_sz; > diff --git a/lib/librte_eal/linuxapp/eal/eal_memory.c > b/lib/librte_eal/linuxapp/eal/eal_memory.c > index 9c9baf628..1c99852f6 100644 > --- a/lib/librte_eal/linuxapp/eal/eal_memory.c > +++ b/lib/librte_eal/linuxapp/eal/eal_memory.c > @@ -108,6 +108,13 @@ test_phys_addrs_available(void) > if (rte_xen_dom0_supported()) > return; > > + if (!rte_eal_has_hugepages()) { > + RTE_LOG(ERR, EAL, > + "Started without hugepages support, physical > addresses not available\n"); > + phys_addrs_available = false; > + return; > + } > + > physaddr = rte_mem_virt2phy(&tmp); > if (physaddr == RTE_BAD_PHYS_ADDR) { > RTE_LOG(ERR, EAL, > diff --git a/lib/librte_mempool/rte_mempool.c > b/lib/librte_mempool/rte_mempool.c > index f65310f60..6fc3c9c7c 100644 > --- a/lib/librte_mempool/rte_mempool.c > +++ b/lib/librte_mempool/rte_mempool.c > @@ -476,7 +476,7 @@ rte_mempool_populate_virt(struct rte_mempool *mp, char > *addr, > /* required for xen_dom0 to get the machine address */ > paddr = rte_mem_phy2mch(-1, paddr); > > - if (paddr == RTE_BAD_PHYS_ADDR) { > + if (paddr == RTE_BAD_PHYS_ADDR && rte_eal_has_hugepages()) { > ret = -EINVAL; > goto fail; > } > -- > 2.11.0 >