diff --git a/Kernel/VM/MemoryManager.cpp b/Kernel/VM/MemoryManager.cpp index aa3f7dccc7..1f46b619f5 100644 --- a/Kernel/VM/MemoryManager.cpp +++ b/Kernel/VM/MemoryManager.cpp @@ -216,6 +216,9 @@ void MemoryManager::parse_memory_map() for (auto& region : m_user_physical_regions) m_user_physical_pages += region.finalize_capacity(); + + ASSERT(m_super_physical_pages > 0); + ASSERT(m_user_physical_pages > 0); } const PageTableEntry* MemoryManager::pte(const PageDirectory& page_directory, VirtualAddress vaddr) @@ -434,13 +437,11 @@ RefPtr MemoryManager::find_free_user_physical_page() RefPtr MemoryManager::allocate_user_physical_page(ShouldZeroFill should_zero_fill) { InterruptDisabler disabler; - RefPtr page = find_free_user_physical_page(); + auto page = find_free_user_physical_page(); if (!page) { - if (m_user_physical_regions.is_empty()) { - klog() << "MM: no user physical regions available (?)"; - } - + // We didn't have a single free physical page. Let's try to free something up! + // First, we look for a purgeable VMObject in the volatile state. for_each_vmobject_of_type([&](auto& vmobject) { int purged_page_count = vmobject.purge_with_interrupts_disabled({}); if (purged_page_count) {