diff options
| author | 2023-01-01 11:38:49 +0000 | |
|---|---|---|
| committer | 2023-01-01 11:40:35 +0000 | |
| commit | fd1831b65bc8a0817776ac41f82b6ff053247b1b (patch) | |
| tree | 75154b03fc6d2e94660da0ec150ec8c147c06d2c /src/common/host_memory.cpp | |
| parent | host_memory: Allocate virtual_base with MAP_NORESERVE (diff) | |
| download | yuzu-fd1831b65bc8a0817776ac41f82b6ff053247b1b.tar.gz yuzu-fd1831b65bc8a0817776ac41f82b6ff053247b1b.tar.xz yuzu-fd1831b65bc8a0817776ac41f82b6ff053247b1b.zip | |
host_memory: Use transparent huge pages where available
Diffstat (limited to 'src/common/host_memory.cpp')
| -rw-r--r-- | src/common/host_memory.cpp | 15 |
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: | |||
| 393 | } | 393 | } |
| 394 | 394 | ||
| 395 | // Virtual memory initialization | 395 | // Virtual memory initialization |
| 396 | #if defined(__FreeBSD__) | ||
| 397 | virtual_base = | ||
| 398 | static_cast<u8*>(mmap(nullptr, virtual_size, PROT_NONE, | ||
| 399 | MAP_PRIVATE | MAP_ANONYMOUS | MAP_ALIGNED_SUPER, -1, 0)); | ||
| 400 | if (virtual_base == MAP_FAILED) { | ||
| 401 | virtual_base = static_cast<u8*>( | ||
| 402 | mmap(nullptr, virtual_size, PROT_NONE, MAP_PRIVATE | MAP_ANONYMOUS, -1, 0)); | ||
| 403 | if (virtual_base == MAP_FAILED) { | ||
| 404 | LOG_CRITICAL(HW_Memory, "mmap failed: {}", strerror(errno)); | ||
| 405 | throw std::bad_alloc{}; | ||
| 406 | } | ||
| 407 | } | ||
| 408 | #else | ||
| 396 | virtual_base = static_cast<u8*>(mmap(nullptr, virtual_size, PROT_NONE, | 409 | virtual_base = static_cast<u8*>(mmap(nullptr, virtual_size, PROT_NONE, |
| 397 | MAP_PRIVATE | MAP_ANONYMOUS | MAP_NORESERVE, -1, 0)); | 410 | MAP_PRIVATE | MAP_ANONYMOUS | MAP_NORESERVE, -1, 0)); |
| 398 | if (virtual_base == MAP_FAILED) { | 411 | if (virtual_base == MAP_FAILED) { |
| 399 | LOG_CRITICAL(HW_Memory, "mmap failed: {}", strerror(errno)); | 412 | LOG_CRITICAL(HW_Memory, "mmap failed: {}", strerror(errno)); |
| 400 | throw std::bad_alloc{}; | 413 | throw std::bad_alloc{}; |
| 401 | } | 414 | } |
| 415 | madvise(virtual_base, virtual_size, MADV_HUGEPAGE); | ||
| 416 | #endif | ||
| 402 | 417 | ||
| 403 | good = true; | 418 | good = true; |
| 404 | } | 419 | } |