CPU架构:power8
系统:Centos7.7 ppc64le
DPDK版本:20.02.1
直接运行dpdk的testpmd,初始化失败,返回EBUSY错误。通过分析内核、dpdk代码和编写示例程序测试,发现在power上,重复mmap一块地址,如果前后映射的页大小不一致,第二次mmap会失败,而在x86上是没问题的。
在dpdk中,一开始会映射一大块连续内存(memseg_primary_init中的alloc_va_space),然而mmap中没有指定MAP_HUGETLB标志,于是映射的是普通页大小(4K),而后来又在这块预留的大内存下申请众多的memseg的大页内存(rte_eal_hugepage_init中的alloc_seg),此时mmap关联/dev/hugepages大页文件系统内的文件,因此这时候映射的页大小是16M(power默认的大页大小),但因为前后页大小不一致,后者映射失败。
我的解决方法是,在第一次映射时添加MAP_HUGETLB标志,虽然能解决这个问题,但同时也引入其它问题,虽然能映射成功,但是映射的地址并不是指定的地址,如指定地址是0x1051c0000,实际映射后的地址是0x3eefff000000(我的理解是大页内存是从另一个固定起始地址开始分配的)。我不清楚这种变数会不会带来影响,尤其是在多进程模式下。
不知道有没有人遇到这样的问题,是否有更好的方法处理。然而我疑惑的是,这是一个似乎很容易出现的问题,dpdk的开发人员难道没遇到?抑或只有我的系统会出现这个问题?因为能找到的有用信息太少了,尤其是power架构的。