启动过程中设置的参数如下:
eal-extra-args: '-c 0x1 --log-level=1 --socket-mem=1024 --file-prefix pg1'
文章结构如下图所示:
主要涉及以下函数,分析使用参数的具体内容:
解析-c参数
int eal_parse_common_option(int opt, const char *optarg,
struct internal_config *conf)
{
case 'c': {
int lcore_indexes[RTE_MAX_LCORE];
//由于没有设置服务类型,不做解析
if (eal_service_cores_parsed())
RTE_LOG(WARNING, EAL,
"Service cores parsed before dataplane cores. Please ensure -c is before -s or -S\n");
//根据-c 0x1解析,lcore_indexes[0] = 0;其它均为-1
if (eal_parse_coremask(optarg, lcore_indexes) < 0) {
RTE_LOG(ERR, EAL, "invalid coremask syntax\n");
return -1;
}
//设置rte_config每个内核的状态,掩码解析出来的设置成ROLE_RTE
if (update_lcore_config(lcore_indexes) < 0) {
char *available = available_cores();
RTE_LOG(ERR, EAL,
"invalid coremask, please check specified cores are part of %s\n",
available);
free(available);
return -1;
}
if (core_parsed) {
RTE_LOG(ERR, EAL, "Option -c is ignored, because (%s) is set!\n",
(core_parsed == LCORE_OPT_LST) ? "-l" :
(core_parsed == LCORE_OPT_MAP) ? "--lcore" :
"-c");
return -1;
}
core_parsed = LCORE_OPT_MSK;
break;
}
}
解析巨页前缀和内存信息
case OPT_FILE_PREFIX_NUM:
{
char *prefix = strdup(optarg);
if (prefix == NULL)
RTE_LOG(ERR, EAL, "Could not store file prefix\n");
else {
/* free old prefix */
if (internal_config.hugefile_prefix != NULL)
free(internal_config.hugefile_prefix);
//prefix = pg1
internal_config.hugefile_prefix = prefix;
}
break;
}
case OPT_SOCKET_MEM_NUM:
//解析数据socket-mem=1024,internal_config.socket_mem根据numa节点设置的,最终将
1024M转换成B保存
if (eal_parse_socket_arg(optarg,
internal_config.socket_mem) < 0) {
RTE_LOG(ERR, EAL, "invalid parameters for --"
OPT_SOCKET_MEM "\n");
eal_usage(prgname);
ret = -1;
goto out;
}
internal_config.force_sockets = 1;
break;
eal_adjust_config函数解析
int
eal_adjust_config(struct internal_config *internal_cfg)
{
int i;
struct rte_config *cfg = rte_eal_get_configuration();
if (!core_parsed)
eal_auto_detect_cores(cfg);
if (internal_config.process_type == RTE_PROC_AUTO)
internal_config.process_type = eal_proc_type_detect();
//将上边程序的0核设置成主核,并设置主核的状态
if (!master_lcore_parsed) {
cfg->master_lcore = rte_get_next_lcore(-1, 0, 0);
if (cfg->master_lcore >= RTE_MAX_LCORE)
return -1;
lcore_config[cfg->master_lcore].core_role = ROLE_RTE;
}
//设置控制线程,把主核和控制线程绑定,将0核设置成控制核
compute_ctrl_threads_cpuset(internal_cfg);
/* if no memory amounts were requested, this will result in 0 and
* will be overridden later, right after eal_hugepage_info_init() */
//计算总内存大小
for (i = 0; i < RTE_MAX_NUMA_NODES; i++)
internal_cfg->memory += internal_cfg->socket_mem[i];
return 0;
}