The problem has been solved after that fix, it's a good solution to this problem :)
And many thanks to you and Anatoly. -----邮件原件----- 发件人: David Marchand [mailto:david.march...@redhat.com] 发送时间: 2019年11月13日 15:34 收件人: Wangyu (Eric) <seven.wan...@huawei.com> 抄送: dev@dpdk.org; ferruh.yi...@intel.com; Linuxarm <linux...@huawei.com>; humin (Q) <humi...@huawei.com>; Liyuan (Larry) <larr...@huawei.com>; dengxiaofeng <dengxiaof...@huawei.com>; Burakov, Anatoly <anatoly.bura...@intel.com> 主题: Re: [dpdk-dev] [PATCH] lib/eal: resolve address conflicts On Mon, Nov 4, 2019 at 11:15 AM Burakov, Anatoly <anatoly.bura...@intel.com> wrote: > > On 04-Nov-19 6:32 AM, Wangyu (Turing Solution Development Dep) wrote: > > > > Resolve address conflicts on 64K pagesize without base_virtaddr, which > > cause new address conflicts in eal_get_virtual_area(). > > > > Signed-off-by: Beard-627 <dengxiaof...@huawei.com> > > Acked-by: Eric wang <seven.wan...@huawei.com> > > Acked-by: Wei Hu <xavier.hu...@huawei.com> > > Acked-by: Min Hu <humi...@huawei.com> > > --- > > lib/librte_eal/linux/eal/eal.c | 22 ++++++++++++++++++++++ > > 1 file changed, 22 insertions(+) > > > > diff --git a/lib/librte_eal/linux/eal/eal.c > > b/lib/librte_eal/linux/eal/eal.c index 946222c..c15d406 100644 > > --- a/lib/librte_eal/linux/eal/eal.c > > +++ b/lib/librte_eal/linux/eal/eal.c > > @@ -360,6 +360,28 @@ enum rte_iova_mode > > return -1; > > } > > > > + if ((getpagesize() == RTE_PGSIZE_64K) && > > + (internal_config.base_virtaddr == 0)) { > > + > > + munmap(rte_mem_cfg_addr, sizeof(*rte_config.mem_config)); > > + rte_mem_cfg_addr = (void *)RTE_PTR_ALIGN_CEIL( > > + (uintptr_t)rte_mem_cfg_addr, (size_t)RTE_PGSIZE_16M); > > + rte_mem_cfg_addr = (void *)RTE_ALIGN_FLOOR( > > + (uintptr_t)rte_mem_cfg_addr - > > + sizeof(*rte_config.mem_config), > > + sysconf(_SC_PAGE_SIZE)); > > Please use RTE_PTR_ADD and RTE_PTR_DIFF to perform pointer arithmetic. > > > + > > + rte_mem_cfg_addr = mmap(rte_mem_cfg_addr, > > + sizeof(*rte_config.mem_config), > > + PROT_READ | PROT_WRITE, MAP_SHARED, > > + mem_cfg_fd, 0); > > + > > + if (rte_mem_cfg_addr == MAP_FAILED) { > > + close(mem_cfg_fd); > > + mem_cfg_fd = -1; > > + RTE_LOG(ERR, EAL, "Cannot mmap memory for > > rte_config\n"); > > + return -1; > > + } > > + } > > + > > memcpy(rte_mem_cfg_addr, &early_mem_config, sizeof(early_mem_config)); > > rte_config.mem_config = rte_mem_cfg_addr; > > > > -- > > 1.8.3.1 > > > > The patch requires a bit more explanation - what exactly is the > problem, and why the solution is as above? Also, did you test it on > the latest master, since the eal_get_virtal_area() patches [1] got merged? > > [1] http://patches.dpdk.org/project/dpdk/list/?series=7043&state=* Please, do you still have an issue after the fix Anatoly pointed at? Thanks. -- David Marchand