eal/windows: initialize hugepage info
[dpdk.git] / lib / librte_eal / windows / eal_hugepages.c
1 #include <rte_errno.h>
2 #include <rte_log.h>
3 #include <rte_memory.h>
4 #include <rte_memzone.h>
5 #include <rte_os.h>
6
7 #include "eal_filesystem.h"
8 #include "eal_hugepages.h"
9 #include "eal_internal_cfg.h"
10 #include "eal_windows.h"
11
12 static int
13 hugepage_claim_privilege(void)
14 {
15         static const wchar_t privilege[] = L"SeLockMemoryPrivilege";
16
17         HANDLE token;
18         LUID luid;
19         TOKEN_PRIVILEGES tp;
20         int ret = -1;
21
22         if (!OpenProcessToken(GetCurrentProcess(),
23                         TOKEN_ADJUST_PRIVILEGES, &token)) {
24                 RTE_LOG_WIN32_ERR("OpenProcessToken()");
25                 return -1;
26         }
27
28         if (!LookupPrivilegeValueW(NULL, privilege, &luid)) {
29                 RTE_LOG_WIN32_ERR("LookupPrivilegeValue(\"%S\")", privilege);
30                 goto exit;
31         }
32
33         tp.PrivilegeCount = 1;
34         tp.Privileges[0].Luid = luid;
35         tp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;
36
37         if (!AdjustTokenPrivileges(
38                         token, FALSE, &tp, sizeof(tp), NULL, NULL)) {
39                 RTE_LOG_WIN32_ERR("AdjustTokenPrivileges()");
40                 goto exit;
41         }
42
43         ret = 0;
44
45 exit:
46         CloseHandle(token);
47
48         return ret;
49 }
50
51 static int
52 hugepage_info_init(void)
53 {
54         struct hugepage_info *hpi;
55         unsigned int socket_id;
56         int ret = 0;
57
58         /* Only one hugepage size available on Windows. */
59         internal_config.num_hugepage_sizes = 1;
60         hpi = &internal_config.hugepage_info[0];
61
62         hpi->hugepage_sz = GetLargePageMinimum();
63         if (hpi->hugepage_sz == 0)
64                 return -ENOTSUP;
65
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.
69          */
70         for (socket_id = 0; socket_id < rte_socket_count(); socket_id++) {
71                 ULONGLONG bytes;
72                 unsigned int numa_node;
73
74                 numa_node = eal_socket_numa_node(socket_id);
75                 if (!GetNumaAvailableMemoryNodeEx(numa_node, &bytes)) {
76                         RTE_LOG_WIN32_ERR("GetNumaAvailableMemoryNodeEx(%u)",
77                                 numa_node);
78                         continue;
79                 }
80
81                 hpi->num_pages[socket_id] = bytes / hpi->hugepage_sz;
82                 RTE_LOG(DEBUG, EAL,
83                         "Found %u hugepages of %zu bytes on socket %u\n",
84                         hpi->num_pages[socket_id], hpi->hugepage_sz, socket_id);
85         }
86
87         /* No hugepage filesystem on Windows. */
88         hpi->lock_descriptor = -1;
89         memset(hpi->hugedir, 0, sizeof(hpi->hugedir));
90
91         return ret;
92 }
93
94 int
95 eal_hugepage_info_init(void)
96 {
97         if (hugepage_claim_privilege() < 0) {
98                 RTE_LOG(ERR, EAL, "Cannot claim hugepage privilege\n");
99                 return -1;
100         }
101
102         if (hugepage_info_init() < 0) {
103                 RTE_LOG(ERR, EAL, "Cannot get hugepage information\n");
104                 return -1;
105         }
106
107         return 0;
108 }