diff --git a/rpcs3/util/vm_native.cpp b/rpcs3/util/vm_native.cpp index 4fe925545c..b0c9305d18 100644 --- a/rpcs3/util/vm_native.cpp +++ b/rpcs3/util/vm_native.cpp @@ -74,6 +74,8 @@ namespace utils return nullptr; } + const auto orig_size = size; + if (!use_addr) { // Hack: Ensure aligned 64k allocations @@ -107,6 +109,11 @@ namespace utils ptr = static_cast(ptr) + (0x10000 - misalign); } +#ifdef MADV_HUGEPAGE + if (orig_size % 0x200000 == 0) + verify(HERE), ::madvise(ptr, orig_size, MADV_HUGEPAGE) != -1; +#endif + return ptr; #endif } @@ -151,6 +158,11 @@ namespace utils #endif verify(HERE), ::mmap(pointer, size, +prot, MAP_FIXED | MAP_ANON | MAP_PRIVATE, -1, 0) != reinterpret_cast(-1); verify(HERE), ::madvise(reinterpret_cast(ptr64 & -4096), size + (ptr64 & 4095), MADV_WILLNEED) != -1; + +#ifdef MADV_HUGEPAGE + if (size % 0x200000 == 0) + verify(HERE), ::madvise(reinterpret_cast(ptr64 & -4096), size + (ptr64 & 4095), MADV_HUGEPAGE) != -1; +#endif #endif } @@ -273,7 +285,9 @@ namespace utils if (ptr64) { - return reinterpret_cast(reinterpret_cast(::mmap(reinterpret_cast(ptr64), m_size, +prot, MAP_SHARED | MAP_FIXED, m_file, 0))); + const auto result = ::mmap(reinterpret_cast(ptr64), m_size, +prot, MAP_SHARED | MAP_FIXED, m_file, 0); + + return reinterpret_cast(result); } else {