3 #include <rte_memory.h>
4 #include <rte_memzone.h>
7 #include "eal_filesystem.h"
8 #include "eal_hugepages.h"
9 #include "eal_internal_cfg.h"
10 #include "eal_windows.h"
13 hugepage_claim_privilege(void)
15 static const wchar_t privilege[] = L"SeLockMemoryPrivilege";
22 if (!OpenProcessToken(GetCurrentProcess(),
23 TOKEN_ADJUST_PRIVILEGES, &token)) {
24 RTE_LOG_WIN32_ERR("OpenProcessToken()");
28 if (!LookupPrivilegeValueW(NULL, privilege, &luid)) {
29 RTE_LOG_WIN32_ERR("LookupPrivilegeValue(\"%S\")", privilege);
33 tp.PrivilegeCount = 1;
34 tp.Privileges[0].Luid = luid;
35 tp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;
37 if (!AdjustTokenPrivileges(
38 token, FALSE, &tp, sizeof(tp), NULL, NULL)) {
39 RTE_LOG_WIN32_ERR("AdjustTokenPrivileges()");
52 hugepage_info_init(void)
54 struct hugepage_info *hpi;
55 unsigned int socket_id;
58 /* Only one hugepage size available on Windows. */
59 internal_config.num_hugepage_sizes = 1;
60 hpi = &internal_config.hugepage_info[0];
62 hpi->hugepage_sz = GetLargePageMinimum();
63 if (hpi->hugepage_sz == 0)
66 /* Assume all memory on each NUMA node available for hugepages,
67 * because Windows neither advertises additional limits,
68 * nor provides an API to query them.
70 for (socket_id = 0; socket_id < rte_socket_count(); socket_id++) {
72 unsigned int numa_node;
74 numa_node = eal_socket_numa_node(socket_id);
75 if (!GetNumaAvailableMemoryNodeEx(numa_node, &bytes)) {
76 RTE_LOG_WIN32_ERR("GetNumaAvailableMemoryNodeEx(%u)",
81 hpi->num_pages[socket_id] = bytes / hpi->hugepage_sz;
83 "Found %u hugepages of %zu bytes on socket %u\n",
84 hpi->num_pages[socket_id], hpi->hugepage_sz, socket_id);
87 /* No hugepage filesystem on Windows. */
88 hpi->lock_descriptor = -1;
89 memset(hpi->hugedir, 0, sizeof(hpi->hugedir));
95 eal_hugepage_info_init(void)
97 if (hugepage_claim_privilege() < 0) {
98 RTE_LOG(ERR, EAL, "Cannot claim hugepage privilege\n");
102 if (hugepage_info_init() < 0) {
103 RTE_LOG(ERR, EAL, "Cannot get hugepage information\n");