vpp环境下,我需要追加一个实现dpdk功能的plugin。该功能以secondary的形式调用了rte_eal_init函数初期化资源,并且通过cli命令来触发运行的。但是通过测试发现和vpp中现有的dpdk primary线程发生了资源冲突。哪里出了问题。如果想要实现的话,具体怎么实现?
时间: 2023-12-03 19:47:40 浏览: 36
出现资源冲突的原因可能是因为vpp中已经有一个dpdk primary线程在使用了,而你又在secondary中初始化了一个新的rte_eal环境,导致资源冲突。
要解决这个问题,可以通过在vpp的主线程中初始化rte_eal环境,并将其作为共享资源传递给secondary线程使用。具体实现可以参考以下步骤:
1. 在vpp主线程中初始化rte_eal环境,并将其保存到vpp的global变量中,例如:
```c
/* 在vlib_main.c中定义全局变量 */
rte_eal_config_t eal_config;
```
然后在vpp的main函数中初始化rte_eal环境,并将其保存到全局变量中:
```c
/* 在vpp_main.c中初始化rte_eal */
int main(int argc, char **argv)
{
/* 初始化rte_eal */
memset(&eal_config, 0, sizeof(eal_config));
eal_config.hugepage_dir = "/mnt/huge";
eal_config.memory = 1024;
eal_config.log_level = RTE_LOG_DEBUG;
rte_eal_init(argc, argv, &eal_config);
/* 将eal_config保存到全局变量中 */
vlib_global_main.eal_config = eal_config;
...
}
```
2. 在你的plugin中,通过调用vpp的cli命令来触发运行。在cli命令中,再次初始化rte_eal环境,并将其从vpp的全局变量中获取。例如:
```c
/* 在你的plugin中定义cli命令 */
static clib_error_t *
run_dpdk_command_fn(vlib_main_t *vm, unformat_input_t *input, vlib_cli_command_t *cmd)
{
/* 从全局变量中获取eal_config */
rte_eal_config_t *eal_config = &(vlib_global_main.eal_config);
/* 初始化rte_eal环境 */
rte_eal_init(0, NULL, eal_config);
/* 运行你的dpdk功能 */
return 0;
}
/* 在你的plugin中注册cli命令 */
VLIB_CLI_COMMAND(run_dpdk_command, static_cast<const char*>("run-dpdk"), run_dpdk_command_fn);
```
这样,在你的plugin中就可以通过调用vpp的cli命令来运行你的dpdk功能了,并且可以避免和vpp中现有的dpdk primary线程发生资源冲突。