xen: fix retrieval of physical address
authorOlivier Matz <olivier.matz@6wind.com>
Mon, 11 Jul 2016 10:20:27 +0000 (12:20 +0200)
committerThomas Monjalon <thomas.monjalon@6wind.com>
Mon, 11 Jul 2016 17:10:09 +0000 (19:10 +0200)
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 <huilongx.xu@intel.com>
Signed-off-by: Olivier Matz <olivier.matz@6wind.com>
lib/librte_eal/linuxapp/eal/eal_memory.c

index b663244..42a29fa 100644 (file)
@@ -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;