1 /* SPDX-License-Identifier: BSD-3-Clause
2 * Copyright(c) 2020 Dmitry Kozlyuk
10 #include <rte_eal_paging.h>
11 #include <rte_errno.h>
14 #include "eal_private.h"
16 #ifdef RTE_EXEC_ENV_LINUX
17 #define EAL_DONTDUMP MADV_DONTDUMP
18 #define EAL_DODUMP MADV_DODUMP
19 #elif defined RTE_EXEC_ENV_FREEBSD
20 #define EAL_DONTDUMP MADV_NOCORE
21 #define EAL_DODUMP MADV_CORE
23 #error "madvise doesn't support this OS"
27 mem_map(void *requested_addr, size_t size, int prot, int flags,
28 int fd, uint64_t offset)
30 void *virt = mmap(requested_addr, size, prot, flags, fd, offset);
31 if (virt == MAP_FAILED) {
33 "Cannot mmap(%p, 0x%zx, 0x%x, 0x%x, %d, 0x%"PRIx64"): %s\n",
34 requested_addr, size, prot, flags, fd, offset,
43 mem_unmap(void *virt, size_t size)
45 int ret = munmap(virt, size);
47 RTE_LOG(DEBUG, EAL, "Cannot munmap(%p, 0x%zx): %s\n",
48 virt, size, strerror(errno));
55 eal_mem_reserve(void *requested_addr, size_t size, int flags)
57 int sys_flags = MAP_PRIVATE | MAP_ANONYMOUS;
59 if (flags & EAL_RESERVE_HUGEPAGES) {
61 sys_flags |= MAP_HUGETLB;
68 if (flags & EAL_RESERVE_FORCE_ADDRESS)
69 sys_flags |= MAP_FIXED;
71 return mem_map(requested_addr, size, PROT_NONE, sys_flags, -1, 0);
75 eal_mem_free(void *virt, size_t size)
77 mem_unmap(virt, size);
81 eal_mem_set_dump(void *virt, size_t size, bool dump)
83 int flags = dump ? EAL_DODUMP : EAL_DONTDUMP;
84 int ret = madvise(virt, size, flags);
86 RTE_LOG(DEBUG, EAL, "madvise(%p, %#zx, %d) failed: %s\n",
87 virt, size, flags, strerror(rte_errno));
94 mem_rte_to_sys_prot(int prot)
96 int sys_prot = PROT_NONE;
98 if (prot & RTE_PROT_READ)
99 sys_prot |= PROT_READ;
100 if (prot & RTE_PROT_WRITE)
101 sys_prot |= PROT_WRITE;
102 if (prot & RTE_PROT_EXECUTE)
103 sys_prot |= PROT_EXEC;
109 rte_mem_map(void *requested_addr, size_t size, int prot, int flags,
110 int fd, uint64_t offset)
115 sys_prot = mem_rte_to_sys_prot(prot);
117 if (flags & RTE_MAP_SHARED)
118 sys_flags |= MAP_SHARED;
119 if (flags & RTE_MAP_ANONYMOUS)
120 sys_flags |= MAP_ANONYMOUS;
121 if (flags & RTE_MAP_PRIVATE)
122 sys_flags |= MAP_PRIVATE;
123 if (flags & RTE_MAP_FORCE_ADDRESS)
124 sys_flags |= MAP_FIXED;
126 return mem_map(requested_addr, size, sys_prot, sys_flags, fd, offset);
130 rte_mem_unmap(void *virt, size_t size)
132 return mem_unmap(virt, size);
136 rte_mem_page_size(void)
138 static size_t page_size;
141 page_size = sysconf(_SC_PAGESIZE);
147 rte_mem_lock(const void *virt, size_t size)
149 int ret = mlock(virt, size);