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:c042ba2067
("mempool: rework support of Xen dom0") Fixes:3097de6e6b
("mem: get physical address of any pointer") Reported-by: Huilong Xu <huilongx.xu@intel.com> Signed-off-by: Olivier Matz <olivier.matz@6wind.com>
This commit is contained in:
parent
9d59b409ca
commit
e33c4d9791
@ -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;
|
||||
|
Loading…
Reference in New Issue
Block a user