rte_eal_init之eal_parse_args

启动过程中设置的参数如下:

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;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值