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