From 85a3678b4fde901fde743c347a4847ef7e73ed20 Mon Sep 17 00:00:00 2001 From: Andreas Kling Date: Fri, 8 May 2020 22:15:02 +0200 Subject: [PATCH] Kernel: Assert on startup if we don't find any physical pages Instead of checking this on every page allocation, just check it once on startup. :^) --- Kernel/VM/MemoryManager.cpp | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) 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) {