From beaec6bd2dc10fdab9e603b6bf2ae826de6cc941 Mon Sep 17 00:00:00 2001 From: Andreas Kling Date: Thu, 7 May 2020 09:41:50 +0200 Subject: [PATCH] Kernel: Memory purging was incorrectly "purging" the shared zero page This caused us to report one purged page per occurrence of the shared zero page in a purgeable memory region, despite it being a no-op. Thanks to Sergey for spotting the bad assertion removal that led to this being found! --- Kernel/VM/MemoryManager.cpp | 1 + Kernel/VM/PurgeableVMObject.cpp | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/Kernel/VM/MemoryManager.cpp b/Kernel/VM/MemoryManager.cpp index 906f3f6a0c..1f0e5c9cd0 100644 --- a/Kernel/VM/MemoryManager.cpp +++ b/Kernel/VM/MemoryManager.cpp @@ -448,6 +448,7 @@ RefPtr MemoryManager::allocate_user_physical_page(ShouldZeroFill s if (purged_page_count) { klog() << "MM: Purge saved the day! Purged " << purged_page_count << " pages from PurgeableVMObject{" << &purgeable_vmobject << "}"; page = find_free_user_physical_page(); + ASSERT(page); return IterationDecision::Break; } } diff --git a/Kernel/VM/PurgeableVMObject.cpp b/Kernel/VM/PurgeableVMObject.cpp index 152029b0a1..8c5c5995d2 100644 --- a/Kernel/VM/PurgeableVMObject.cpp +++ b/Kernel/VM/PurgeableVMObject.cpp @@ -74,7 +74,7 @@ int PurgeableVMObject::purge_impl() return 0; int purged_page_count = 0; for (size_t i = 0; i < m_physical_pages.size(); ++i) { - if (m_physical_pages[i]) + if (m_physical_pages[i] && !m_physical_pages[i]->is_shared_zero_page()) ++purged_page_count; m_physical_pages[i] = MM.shared_zero_page(); }