numam-dpdk/lib/eal/windows/eal_hugepages.c
Bruce Richardson 99a2dd955f lib: remove librte_ prefix from directory names
There is no reason for the DPDK libraries to all have 'librte_' prefix on
the directory names. This prefix makes the directory names longer and also
makes it awkward to add features referring to individual libraries in the
build - should the lib names be specified with or without the prefix.
Therefore, we can just remove the library prefix and use the library's
unique name as the directory name, i.e. 'eal' rather than 'librte_eal'

Signed-off-by: Bruce Richardson <bruce.richardson@intel.com>
2021-04-21 14:04:09 +02:00

120 lines
2.7 KiB
C

/* SPDX-License-Identifier: BSD-3-Clause
* Copyright (c) 2020 Dmitry Kozlyuk
*/
#include <rte_errno.h>
#include <rte_log.h>
#include <rte_memory.h>
#include <rte_memzone.h>
#include "eal_private.h"
#include "eal_filesystem.h"
#include "eal_hugepages.h"
#include "eal_internal_cfg.h"
#include "eal_windows.h"
static int
hugepage_claim_privilege(void)
{
static const wchar_t privilege[] = L"SeLockMemoryPrivilege";
HANDLE token;
LUID luid;
TOKEN_PRIVILEGES tp;
int ret = -1;
if (!OpenProcessToken(GetCurrentProcess(),
TOKEN_ADJUST_PRIVILEGES, &token)) {
RTE_LOG_WIN32_ERR("OpenProcessToken()");
return -1;
}
if (!LookupPrivilegeValueW(NULL, privilege, &luid)) {
RTE_LOG_WIN32_ERR("LookupPrivilegeValue(\"%S\")", privilege);
goto exit;
}
tp.PrivilegeCount = 1;
tp.Privileges[0].Luid = luid;
tp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;
if (!AdjustTokenPrivileges(
token, FALSE, &tp, sizeof(tp), NULL, NULL)) {
RTE_LOG_WIN32_ERR("AdjustTokenPrivileges()");
goto exit;
}
/* AdjustTokenPrivileges() may succeed with ERROR_NOT_ALL_ASSIGNED. */
if (GetLastError() != ERROR_SUCCESS)
goto exit;
ret = 0;
exit:
CloseHandle(token);
return ret;
}
static int
hugepage_info_init(void)
{
struct hugepage_info *hpi;
unsigned int socket_id;
int ret = 0;
struct internal_config *internal_conf =
eal_get_internal_configuration();
/* Only one hugepage size available on Windows. */
internal_conf->num_hugepage_sizes = 1;
hpi = &internal_conf->hugepage_info[0];
hpi->hugepage_sz = GetLargePageMinimum();
if (hpi->hugepage_sz == 0)
return -ENOTSUP;
/* Assume all memory on each NUMA node available for hugepages,
* because Windows neither advertises additional limits,
* nor provides an API to query them.
*/
for (socket_id = 0; socket_id < rte_socket_count(); socket_id++) {
ULONGLONG bytes;
unsigned int numa_node;
numa_node = eal_socket_numa_node(socket_id);
if (!GetNumaAvailableMemoryNodeEx(numa_node, &bytes)) {
RTE_LOG_WIN32_ERR("GetNumaAvailableMemoryNodeEx(%u)",
numa_node);
continue;
}
hpi->num_pages[socket_id] = bytes / hpi->hugepage_sz;
RTE_LOG(DEBUG, EAL,
"Found %u hugepages of %zu bytes on socket %u\n",
hpi->num_pages[socket_id], hpi->hugepage_sz, socket_id);
}
/* No hugepage filesystem on Windows. */
hpi->lock_descriptor = -1;
memset(hpi->hugedir, 0, sizeof(hpi->hugedir));
return ret;
}
int
eal_hugepage_info_init(void)
{
if (hugepage_claim_privilege() < 0) {
RTE_LOG(ERR, EAL, "Cannot claim hugepage privilege\n"
"Verify that large-page support privilege is assigned to the current user\n");
return -1;
}
if (hugepage_info_init() < 0) {
RTE_LOG(ERR, EAL, "Cannot discover available hugepages\n");
return -1;
}
return 0;
}