Browse Source

[core] don't keep trying to allocate HostMemory buffer

remotes/1785372757367212240/tmp_refs/heads/variable-page-size
Exverge 4 weeks ago
parent
commit
f0604eca00
No known key found for this signature in database GPG Key ID: DAD399BCC5FB77E4
  1. 7
      src/common/host_memory.cpp
  2. 3
      src/common/virtual_buffer.cpp

7
src/common/host_memory.cpp

@ -177,7 +177,7 @@ public:
if (res == 0) { if (res == 0) {
LOG_WARNING(HW_Memory, "Failed to check memory region: {}", GetLastError()); LOG_WARNING(HW_Memory, "Failed to check memory region: {}", GetLastError());
continue;
break;
} }
auto start_aligned = AlignUp(reinterpret_cast<SIZE_T>(info.BaseAddress), HugePageSize); auto start_aligned = AlignUp(reinterpret_cast<SIZE_T>(info.BaseAddress), HugePageSize);
@ -187,6 +187,11 @@ public:
if (info.RegionSize - (start_aligned - reinterpret_cast<SIZE_T>(info.BaseAddress)) >= virtual_size) { if (info.RegionSize - (start_aligned - reinterpret_cast<SIZE_T>(info.BaseAddress)) >= virtual_size) {
virtual_base = static_cast<u8*>(pfn_VirtualAlloc2 virtual_base = static_cast<u8*>(pfn_VirtualAlloc2
(process, reinterpret_cast<PVOID>(start_aligned), virtual_size, MEM_RESERVE | MEM_RESERVE_PLACEHOLDER, PAGE_NOACCESS, nullptr, 0)); (process, reinterpret_cast<PVOID>(start_aligned), virtual_size, MEM_RESERVE | MEM_RESERVE_PLACEHOLDER, PAGE_NOACCESS, nullptr, 0));
if (virtual_base) {
break;
} else {
LOG_WARNING(HW_Memory, "Failed to allocate buffer at {:#x}, trying at at new address", start_aligned);
}
} }
} }

3
src/common/virtual_buffer.cpp

@ -22,12 +22,13 @@ void* AllocateMemoryPages(std::size_t size) noexcept {
// Probably failing to reserve is less likely than failing to commit // Probably failing to reserve is less likely than failing to commit
base = VirtualAlloc(nullptr, size, MEM_COMMIT, PAGE_READWRITE); base = VirtualAlloc(nullptr, size, MEM_COMMIT, PAGE_READWRITE);
} }
ASSERT_MSG(base, "Failed to allocate {} pages, error {}", size, GetLastError());
#else #else
void* base = mmap(nullptr, size, PROT_READ | PROT_WRITE, MAP_ANON | MAP_PRIVATE, -1, 0); void* base = mmap(nullptr, size, PROT_READ | PROT_WRITE, MAP_ANON | MAP_PRIVATE, -1, 0);
if (base == MAP_FAILED) if (base == MAP_FAILED)
base = nullptr; base = nullptr;
ASSERT_MSG(base, "Failed to allocate {} pages, error {}", size, strerror(errno));
#endif #endif
ASSERT(base);
return base; return base;
} }

Loading…
Cancel
Save