Example #1
0
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;
		}
	}
Example #2
0
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;
}