Пример #1
0
static const char *
get_hugepage_dir(uint64_t hugepage_sz)
{
	enum proc_mount_fieldnames {
		DEVICE = 0,
		MOUNTPT,
		FSTYPE,
		OPTIONS,
		_FIELDNAME_MAX
	};
	static uint64_t default_size = 0;
	const char proc_mounts[] = "/proc/mounts";
	const char hugetlbfs_str[] = "hugetlbfs";
	const size_t htlbfs_str_len = sizeof(hugetlbfs_str) - 1;
	const char pagesize_opt[] = "pagesize=";
	const size_t pagesize_opt_len = sizeof(pagesize_opt) - 1;
	const char split_tok = ' ';
	char *splitstr[_FIELDNAME_MAX];
	char buf[BUFSIZ];
	char *retval = NULL;

	FILE *fd = fopen(proc_mounts, "r");
	if (fd == NULL)
		rte_panic("Cannot open %s\n", proc_mounts);

	if (default_size == 0)
		default_size = get_default_hp_size();

	while (fgets(buf, sizeof(buf), fd)){
		if (rte_strsplit(buf, sizeof(buf), splitstr, _FIELDNAME_MAX,
				split_tok) != _FIELDNAME_MAX) {
			RTE_LOG(ERR, EAL, "Error parsing %s\n", proc_mounts);
			break; /* return NULL */
		}

		/* we have a specified --huge-dir option, only examine that dir */
		if (internal_config.hugepage_dir != NULL &&
				strcmp(splitstr[MOUNTPT], internal_config.hugepage_dir) != 0)
			continue;

		if (strncmp(splitstr[FSTYPE], hugetlbfs_str, htlbfs_str_len) == 0){
			const char *pagesz_str = strstr(splitstr[OPTIONS], pagesize_opt);

			/* if no explicit page size, the default page size is compared */
			if (pagesz_str == NULL){
				if (hugepage_sz == default_size){
					retval = strdup(splitstr[MOUNTPT]);
					break;
				}
			}
			/* there is an explicit page size, so check it */
			else {
				uint64_t pagesz = rte_str_to_size(&pagesz_str[pagesize_opt_len]);
				if (pagesz == hugepage_sz) {
					retval = strdup(splitstr[MOUNTPT]);
					break;
				}
			}
		} /* end if strncmp hugetlbfs */
	} /* end while fgets */

	fclose(fd);
	return retval;
}
Пример #2
0
static const char *get_hugepage_dir(uint64_t hugepage_sz)
{
	enum proc_mount_fieldnames {
		DEVICE = 0,
		MOUNTPT,
		FSTYPE,
		OPTIONS,
		_FIELDNAME_MAX
	};
	static uint64_t default_size;
	const char split_tok = ' ';
	char *splitstr[_FIELDNAME_MAX];
	char  buf[ODP_BUFF_SIZE];
	char *retval = NULL;

	FILE *fd = fopen("/proc/mounts", "r");

	if (!fd)
		ODP_PRINT("Cannot open proc_mount\n");

	if (default_size == 0)
		default_size = get_default_hp_size();

	while (fgets(buf, sizeof(buf), fd)) {
		if (odp_strsplit(buf, sizeof(buf), splitstr, _FIELDNAME_MAX,
				 split_tok) != _FIELDNAME_MAX) {
			ODP_PRINT("Error parsing proc_mount\n");
			break; /* return NULL */
		}

		if (strncmp(splitstr[FSTYPE], HUGETLBFS_DESC,
			    HGTLB_DSC_LEN) == 0) {
			const char *pagesz_str = strstr(splitstr[OPTIONS],
							HUGEPAGE_SIZE_DESC);

			/* if no explicit page size, the
			 * default page size is compared */
			if (!pagesz_str) {
				if (hugepage_sz == default_size) {
					retval = strdup(splitstr[MOUNTPT]);
					break;
				}
			}

			/* there is an explicit page size, so check it */
			else {
				uint64_t pagesz =
					odp_str_to_size(
						&pagesz_str[HP_DESC_LEN]);

				if (pagesz == hugepage_sz) {
					retval = strdup(splitstr[MOUNTPT]);
					break;
				}
			}
		} /* end if strncmp hugetlbfs */
	}   /* end while fgets */

	fclose(fd);
	return retval;
}