l2fwd + pdump 的 例程 和 `--base-virtaddr` 选项

本文详细介绍了如何在l2fwd程序中添加pdump功能,以及在遇到dpdk-pdump无法映射到指定地址时,如何通过添加 '--base-virtaddr' 选项来正确设置l2fwd的启动参数,确保主副进程虚拟地址一致,从而解决启动错误的问题。
摘要由CSDN通过智能技术生成

l2fwd + pdump 的 例程

修改 l2fwd 的 例程

在 l2fwd 的 例程上添加 pdump 的功能:

  1. 头文件引用 <rte_pdump.h>
  2. signal_handler() 中添加 rte_pdump_uninit()
  3. main() 中添加 rte_pdump_init()

差分结果

  • 左边 是修改前。
  • 右边 是修改后。添加了 pdump 的 功能。
	41c41,43
	< 
	---
	> #ifdef RTE_LIBRTE_PDUMP
	> #include <rte_pdump.h>
	> #endif
	509a512,515
	> #ifdef RTE_LIBRTE_PDUMP
	> 		/* uninitialize packet capture framework */
	> 		rte_pdump_uninit();
	> #endif
	536a543,548
	> 
	> #ifdef RTE_LIBRTE_PDUMP
	> 	#warning l2fwd with pdump
	> 	/* initialize packet capture framework */
	> 	rte_pdump_init(NULL);
	> #endif

启动 l2fwd 的 例程(没有设置好 --base-virtaddr

	./build/l2fwd -d librte_pmd_ixgbe.so -w 08:00.0 -w 08:00.1 -c 0xf0 -n 4 --proc-type primary  -- -q 8 -p 0x3 -T 1 --no-mac-updating

启动 dpdk-pdump 的 例程

	./dpdk-pdump -w 08:00.0 -w 08:00.1 -d librte_pmd_pcap.so -d librte_pmd_ixgbe.so --proc-type secondary -- --pdump 'port=0,queue=*,rx-dev=/tmp/capture.pcap'  
	
	>	EAL: Cannot get a virtual area at requested address: 0x7ffbef800000 (got 0x7ffbef543000)
	>	EAL: Could not mmap 17179869184 bytes at [0x7ffbef800000] - please use '--base-virtaddr' option
	>	EAL: Cannot preallocate VA space for hugepage memory
	>	EAL: FATAL: Cannot init memory
	>	EAL: Cannot init memory
    >	
	>	PANIC in main():
	>	Cannot init EAL

分析

由于 dpdk-pdump 的例程 无法 映射到 0x7ffbef800000,但却可以 映射到 0x7ffbef543000。所以出现错误退出。

EAL: Cannot get a virtual area at requested address: 0x7ffbef800000 (got 0x7ffbef543000) <-- eal_get_virtual_area() 抛出错误

dpdk-pdump 的例程 给出了提示:

EAL: Could not mmap 17179869184 bytes at [0x7ffbef800000] - please use ‘–base-virtaddr’ option <-- alloc_va_space() 的提示

所以需要修改 primary 进程(也就是 l2fwd 的 例程),启动的时候设置 --base-virtaddr

注意

dpdk-pdump 的例程 的命令行无需改变。

重新启动 l2fwd 的 例程(正确的设置好 --base-virtaddr

增加 l2fwd 的 例程的启动参数 --base-virtaddr。参数为 0x7ffbef543000
新的 l2fwd 的 例程的命令行参数如下:

	./build/l2fwd -d librte_pmd_ixgbe.so -w 08:00.0 -w 08:00.1 -c 0xf0 -n 4 --proc-type primary --base-virtaddr 0x7ffbef543000 -- -q 8 -p 0x3 -T 1 --no-mac-updating

使用 --base-virtaddr 的 原因

dpdk-pdump 的 例程 报错的原因分析

  1. 第一个错误

dpdk-pdump 的 例程中,第一个报错如下:

EAL: Cannot get a virtual area at requested address: 0x7ffbef800000 (got 0x7ffbef543000) <-- eal_get_virtual_area() 抛出错误

其中的错误,出自 eal_get_virtual_area()
如果 requested_addraligned_addr 不匹配。则提示出错。

eal_get_virtual_area() 的源码,经过简化后如下:

	void *
	eal_get_virtual_area(void *requested_addr, size_t *size,
			size_t page_sz, int flags, int mmap_flags)
	{
   
		/* ...  */
		
		/* 映射虚拟地址 */
		mapped_addr = mmap(requested_addr, (size_t)map_sz, PROT_READ,
				mmap_flags, -1, 0);

		/* 经过了简化,去除了地址对齐 */
		aligned_addr = mapped_addr :

		/* 如果 `requested_addr` 和 `aligned_addr` 不匹配。则提示出错 */
		if (requested_addr != NULL 
		&& 	aligned_addr != requested_addr) {
   
			RTE_LOG(ERR, EAL, "Cannot get a virtual area at requested address: %p (got %p)\n",
				requested_addr, aligned_addr);
			munmap(mapped_addr, map_sz);
			rte_errno = EADDRNOTAVAIL;
			return NULL;
		} 
		return aligned_addr;
	}
  1. 第二个错误

dpdk-pdump 的 例程中,第二个报错如下:

EAL: Could not mmap 17179869184

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值