summaryrefslogtreecommitdiff
path: root/src/common/host_memory.cpp
diff options
context:
space:
mode:
authorMerry <git@mary.rs>2023-01-01 11:38:49 +0000
committerMerry <git@mary.rs>2023-01-01 11:40:35 +0000
commitfd1831b65bc8a0817776ac41f82b6ff053247b1b (patch)
tree75154b03fc6d2e94660da0ec150ec8c147c06d2c /src/common/host_memory.cpp
parent4d7be85e730bc7f46ec5433c425733c4b65a90ed (diff)
host_memory: Use transparent huge pages where available
Diffstat (limited to 'src/common/host_memory.cpp')
-rw-r--r--src/common/host_memory.cpp15
1 files changed, 15 insertions, 0 deletions
diff --git a/src/common/host_memory.cpp b/src/common/host_memory.cpp
index 4a67f77b2..611c7d1a3 100644
--- a/src/common/host_memory.cpp
+++ b/src/common/host_memory.cpp
@@ -393,12 +393,27 @@ public:
}
// Virtual memory initialization
+#if defined(__FreeBSD__)
+ virtual_base =
+ static_cast<u8*>(mmap(nullptr, virtual_size, PROT_NONE,
+ MAP_PRIVATE | MAP_ANONYMOUS | MAP_ALIGNED_SUPER, -1, 0));
+ if (virtual_base == MAP_FAILED) {
+ virtual_base = static_cast<u8*>(
+ mmap(nullptr, virtual_size, PROT_NONE, MAP_PRIVATE | MAP_ANONYMOUS, -1, 0));
+ if (virtual_base == MAP_FAILED) {
+ LOG_CRITICAL(HW_Memory, "mmap failed: {}", strerror(errno));
+ throw std::bad_alloc{};
+ }
+ }
+#else
virtual_base = static_cast<u8*>(mmap(nullptr, virtual_size, PROT_NONE,
MAP_PRIVATE | MAP_ANONYMOUS | MAP_NORESERVE, -1, 0));
if (virtual_base == MAP_FAILED) {
LOG_CRITICAL(HW_Memory, "mmap failed: {}", strerror(errno));
throw std::bad_alloc{};
}
+ madvise(virtual_base, virtual_size, MADV_HUGEPAGE);
+#endif
good = true;
}