博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
dpdk中的大页初始化
阅读量:4215 次
发布时间:2019-05-26

本文共 3494 字,大约阅读时间需要 11 分钟。

[root@localhost ~]# cd /sys/kernel/mm/hugepages[root@localhost hugepages]# ls -altotal 0drwxr-xr-x. 4 root root 0 6月   5 04:53 .drwxr-xr-x. 5 root root 0 6月   5 04:53 ..drwxr-xr-x. 2 root root 0 6月   6 07:27 hugepages-1048576kBdrwxr-xr-x. 2 root root 0 6月   6 07:27 hugepages-2048kB[root@localhost hugepages]# cd hugepages-2048kB[root@localhost hugepages-2048kB]# lsfree_hugepages  nr_hugepages  nr_hugepages_mempolicy  nr_overcommit_hugepages  resv_hugepages  surplus_hugepages[root@localhost hugepages-2048kB]#在dpdk中主要通过eal_hugepage_info_init 来会的大页的信息,也就是主要parse /sys/kernel/mm/hugepages 这个目录下面的内容这个目录下面的内容如上所示inteal_hugepage_info_init(void){	const char dirent_start_text[] = "hugepages-";	const size_t dirent_start_len = sizeof(dirent_start_text) - 1;	unsigned i, num_sizes = 0;	DIR *dir;	struct dirent *dirent;	#打开包含大页的目录 /sys/kernel/mm/hugepages	dir = opendir(sys_dir_path);	if (dir == NULL) {		RTE_LOG(ERR, EAL,			"Cannot open directory %s to read system hugepage info\n",			sys_dir_path);		return -1;	}	#从本例看大页的目录下有两个子目录,这两个子目录是按照大页的size 来分类的,所以下面这个for 循环会循环两次	for (dirent = readdir(dir); dirent != NULL; dirent = readdir(dir)) {		struct hugepage_info *hpi;		#比较目录名是否以开始 ,例如 hugepages-2048kB		if (strncmp(dirent->d_name, dirent_start_text,			    dirent_start_len) != 0)			continue;		#大页的size的种类不能超过3个,本例中就刚好是两个		if (num_sizes >= MAX_HUGEPAGE_SIZES)			break;		#得到要保存大页信息的全局变量		hpi = &internal_config.hugepage_info[num_sizes];		#根据目录的name得到大页的size ,例如hugepages-1048576kB的size就是页大小就是2048K		hpi->hugepage_sz =			rte_str_to_size(&dirent->d_name[dirent_start_len]);		#得到大页的目录		hpi->hugedir = get_hugepage_dir(hpi->hugepage_sz);		/* first, check if we have a mountpoint */		#如果大页的目录为null,则可能还没有mount hugetlbfs		if (hpi->hugedir == NULL) {			uint32_t num_pages;			num_pages = get_num_hugepages(dirent->d_name);			if (num_pages > 0)				RTE_LOG(NOTICE, EAL,					"%" PRIu32 " hugepages of size "					"%" PRIu64 " reserved, but no mounted "					"hugetlbfs found for that size\n",					num_pages, hpi->hugepage_sz);			continue;		}		/* try to obtain a writelock */		#打开这个目录,并保存目录描述符		hpi->lock_descriptor = open(hpi->hugedir, O_RDONLY);		/* if blocking lock failed */		#锁定这个目录		if (flock(hpi->lock_descriptor, LOCK_EX) == -1) {			RTE_LOG(CRIT, EAL,				"Failed to lock hugepage directory!\n");			break;		}		/* clear out the hugepages dir from unused pages */		if (clear_hugedir(hpi->hugedir) == -1)			break;		/* for now, put all pages into socket 0,		 * later they will be sorted */		#得到实际大页的个数		hpi->num_pages[0] = get_num_hugepages(dirent->d_name);#ifndef RTE_ARCH_64		/* for 32-bit systems, limit number of hugepages to		 * 1GB per page size */		 #如果是32 位系统的话,则大页不能超过1GB		hpi->num_pages[0] = RTE_MIN(hpi->num_pages[0],					    RTE_PGSIZE_1G / hpi->hugepage_sz);#endif		num_sizes++;	}	#关掉这个目录/sys/kernel/mm/hugepages	closedir(dir);	/* something went wrong, and we broke from the for loop above */	if (dirent != NULL)		return -1;	internal_config.num_hugepage_sizes = num_sizes;	/* sort the page directory entries by size, largest to smallest */	#对已经保存的大页按照size 从小到大排序	qsort(&internal_config.hugepage_info[0], num_sizes,	      sizeof(internal_config.hugepage_info[0]), compare_hpi);	/* now we have all info, check we have at least one valid size */	#再次检查保存大页的全局变量中目录和大约的个数不能为null	for (i = 0; i < num_sizes; i++)		if (internal_config.hugepage_info[i].hugedir != NULL &&		    internal_config.hugepage_info[i].num_pages[0] > 0)			return 0;	/* no valid hugepage mounts available, return error */	return -1;}

转载地址:http://tnnmi.baihongyu.com/

你可能感兴趣的文章
win下创建win32控制台工程,执行lua脚本
查看>>
cocos2dx android启动错误
查看>>
eclipse: android rename package name
查看>>
cocos2dx c++调用java思想
查看>>
cocos2dx lua Node节点 私有数据存取
查看>>
lua math.ceil math.ceil
查看>>
cocos2dx CCNode计算node的大小
查看>>
cocos2dx 布局记录(1)
查看>>
lua 多行注释和取消多行注释
查看>>
缩放系数计算
查看>>
cocos2dx --- 按钮点击居中放大
查看>>
cocos2dx menu位置计算
查看>>
cocos2dx资源加载机制(同步/异步)
查看>>
cocos2dx C++调用java -- 字符串传递
查看>>
git学习网站
查看>>
JavaScript 学习网站
查看>>
cocos2dx java调用c++ -- 字符串传递
查看>>
CCScaleTo与CCScaleBy比较
查看>>
cocos2dx CCObject引用计数,内存释放分析(1)
查看>>
cocos2dx2.X 编译时,传递编译选项
查看>>