static int calc_num_pages_per_socket(uint64_t *memory, struct odp_hugepage_type *hp_info, struct odp_hugepage_type *hp_used, unsigned num_hp_info) { unsigned socket, j, i = 0; unsigned requested, available; int total_num_pages = 0; uint64_t remaining_mem, cur_mem; uint64_t total_mem = local_config.memory; if (num_hp_info == 0) return -1; if (local_config.force_sockets == 0) { int cpu_per_socket[ODP_MAX_NUMA_NODES]; size_t default_size, total_size; unsigned core_id; memset(cpu_per_socket, 0, sizeof(cpu_per_socket)); ODP_LCORE_FOREACH(core_id) { cpu_per_socket[odp_core_to_socket_id(core_id)]++; } total_size = local_config.memory; for (socket = 0; socket < ODP_MAX_NUMA_NODES && total_size != 0; socket++) { default_size = (local_config.memory * cpu_per_socket[socket]) / odp_core_num(); default_size = ODP_MIN(default_size, get_socket_mem_size(socket)); memory[socket] = default_size; total_size -= default_size; } for (socket = 0; socket < ODP_MAX_NUMA_NODES && total_size != 0; socket++) { default_size = ODP_MIN(get_socket_mem_size(socket) - memory[socket], total_size); memory[socket] += default_size; total_size -= default_size; } }
int odp_hugepage_info_init(void) { unsigned i, num_sizes = 0; struct dirent *dirent = NULL; DIR *dir = NULL; struct odp_hugepage_type *hpt = NULL; dir = opendir(sys_dir_path); if (!dir) ODP_PRINT("Cannot open directory %s to " "read system hugepage info\n", sys_dir_path); dirent = readdir(dir); /* loop get different kinds of hugepages in * the system hugepage directory */ while (dirent) { if (strncmp(dirent->d_name, "hugepages-", ODP_SYS_HGPG_STR_LEN) == 0) { hpt = &local_config.odp_hugepage_type[num_sizes]; hpt->hugepage_sz = odp_str_to_size(&dirent->d_name[ ODP_SYS_HGPG_STR_LEN]); hpt->hugedir = get_hugepage_dir(hpt->hugepage_sz); /* first, check if we have a mountpoint */ if (!hpt->hugedir) { int32_t num_pages; num_pages = get_num_hugepages(dirent->d_name); if (num_pages > 0) { ODP_PRINT("%d hugepages of" " size %lu reserved, ", num_pages, hpt->hugepage_sz); ODP_PRINT("but no mounted hugetlbfs" " found for that size\n"); } } else { /* try to obtain a writelock */ hpt->lock_descriptor = open(hpt->hugedir, O_RDONLY); /* if blocking lock failed */ if (flock(hpt->lock_descriptor, LOCK_EX) == -1) { ODP_ERR("Failed to lock hugepage" " directory!\n"); closedir(dir); return -1; } /* clear out the hugepages * dir from unused pages */ if (clear_hugedir(hpt->hugedir) == -1) { closedir(dir); return -1; } /* for now, put all pages into socket 0, * later they will be sohodpd */ hpt->num_pages[0] = get_num_hugepages(dirent->d_name); hpt->num_pages[0] = ODP_MIN(hpt->num_pages[0], ODP_PAGE_MEMORY_MAX / hpt->hugepage_sz); num_sizes++; } } dirent = readdir(dir); } closedir(dir); local_config.num_hugepage_types = num_sizes; /* sort the page directory entries by size, largest to smallest */ for (i = 0; i < num_sizes; i++) { unsigned int j; for (j = i + 1; j < num_sizes; j++) if (local_config.odp_hugepage_type[j - 1].hugepage_sz < local_config.odp_hugepage_type[j].hugepage_sz) swap_hpt( &local_config.odp_hugepage_type[j - 1], &local_config.odp_hugepage_type[j]); } /* now we have all info, check we have at least one valid size */ for (i = 0; i < num_sizes; i++) if (local_config.odp_hugepage_type[i].hugedir && (local_config.odp_hugepage_type[i].num_pages[0] > 0)) return 0; /* no valid hugepage mounts available, return error */ return -1; }