From: Olivier Matz Date: Mon, 11 Jul 2016 10:20:27 +0000 (+0200) Subject: xen: fix retrieval of physical address X-Git-Tag: spdx-start~6181 X-Git-Url: http://git.droids-corp.org/?a=commitdiff_plain;h=e33c4d97913e06b46573a9a43beaf979f8444790;p=dpdk.git xen: fix retrieval of physical address When using Xen Dom0, it looks that /proc/self/pagemap returns 0. This breaks the creation of mbufs pool. We can workaround this in rte_mem_virt2phy() by browsing the dpdk memory segments. This only works for dpdk memory, but it's enough to fix the mempool creation. Fixes: c042ba20674a ("mempool: rework support of Xen dom0") Fixes: 3097de6e6bfb ("mem: get physical address of any pointer") Reported-by: Huilong Xu Signed-off-by: Olivier Matz --- diff --git a/lib/librte_eal/linuxapp/eal/eal_memory.c b/lib/librte_eal/linuxapp/eal/eal_memory.c index b663244fdb..42a29fafd8 100644 --- a/lib/librte_eal/linuxapp/eal/eal_memory.c +++ b/lib/librte_eal/linuxapp/eal/eal_memory.c @@ -164,6 +164,29 @@ rte_mem_virt2phy(const void *virtaddr) int page_size; off_t offset; + /* when using dom0, /proc/self/pagemap always returns 0, check in + * dpdk memory by browsing the memsegs */ + if (rte_xen_dom0_supported()) { + struct rte_mem_config *mcfg; + struct rte_memseg *memseg; + unsigned i; + + mcfg = rte_eal_get_configuration()->mem_config; + for (i = 0; i < RTE_MAX_MEMSEG; i++) { + memseg = &mcfg->memseg[i]; + if (memseg->addr == NULL) + break; + if (virtaddr > memseg->addr && + virtaddr < RTE_PTR_ADD(memseg->addr, + memseg->len)) { + return memseg->phys_addr + + RTE_PTR_DIFF(virtaddr, memseg->addr); + } + } + + return RTE_BAD_PHYS_ADDR; + } + /* Cannot parse /proc/self/pagemap, no need to log errors everywhere */ if (!proc_pagemap_readable) return RTE_BAD_PHYS_ADDR;