From 118cb391dddb33ca528309e1526464bd824b7e72 Mon Sep 17 00:00:00 2001 From: Sergey Bugaev Date: Fri, 14 Jun 2019 14:56:21 +0300 Subject: [PATCH] VM: Pass a PhysicalPage by rvalue reference when returning it to the freelist. This makes no functional difference, but it makes it clear that MemoryManager and PhysicalRegion take over the actual physical page represented by this PhysicalPage instance. --- Kernel/VM/MemoryManager.cpp | 8 ++++---- Kernel/VM/MemoryManager.h | 4 ++-- Kernel/VM/PhysicalPage.cpp | 6 +++--- Kernel/VM/PhysicalPage.h | 4 ++-- Kernel/VM/PhysicalRegion.h | 2 +- 5 files changed, 12 insertions(+), 12 deletions(-) diff --git a/Kernel/VM/MemoryManager.cpp b/Kernel/VM/MemoryManager.cpp index 3f1fd93753..d45fcda41f 100644 --- a/Kernel/VM/MemoryManager.cpp +++ b/Kernel/VM/MemoryManager.cpp @@ -458,7 +458,7 @@ RetainPtr MemoryManager::allocate_kernel_region(size_t size, String&& na return region; } -void MemoryManager::deallocate_user_physical_page(PhysicalPage& page) +void MemoryManager::deallocate_user_physical_page(PhysicalPage&& page) { for (auto& region : m_user_physical_regions) { if (!region->contains(page)) { @@ -468,7 +468,7 @@ void MemoryManager::deallocate_user_physical_page(PhysicalPage& page) continue; } - region->return_page(page); + region->return_page(move(page)); m_user_physical_pages_used--; return; @@ -515,7 +515,7 @@ RetainPtr MemoryManager::allocate_user_physical_page(ShouldZeroFil return page; } -void MemoryManager::deallocate_supervisor_physical_page(PhysicalPage& page) +void MemoryManager::deallocate_supervisor_physical_page(PhysicalPage&& page) { for (auto& region : m_super_physical_regions) { if (!region->contains(page)) { @@ -525,7 +525,7 @@ void MemoryManager::deallocate_supervisor_physical_page(PhysicalPage& page) continue; } - region->return_page(page); + region->return_page(move(page)); m_super_physical_pages_used--; return; diff --git a/Kernel/VM/MemoryManager.h b/Kernel/VM/MemoryManager.h index 29a985adc1..efa291e41c 100644 --- a/Kernel/VM/MemoryManager.h +++ b/Kernel/VM/MemoryManager.h @@ -63,8 +63,8 @@ public: RetainPtr allocate_user_physical_page(ShouldZeroFill); RetainPtr allocate_supervisor_physical_page(); - void deallocate_user_physical_page(PhysicalPage&); - void deallocate_supervisor_physical_page(PhysicalPage&); + void deallocate_user_physical_page(PhysicalPage&&); + void deallocate_supervisor_physical_page(PhysicalPage&&); void remap_region(PageDirectory&, Region&); diff --git a/Kernel/VM/PhysicalPage.cpp b/Kernel/VM/PhysicalPage.cpp index 43d014a0c8..2ddb1d02a5 100644 --- a/Kernel/VM/PhysicalPage.cpp +++ b/Kernel/VM/PhysicalPage.cpp @@ -23,7 +23,7 @@ PhysicalPage::PhysicalPage(PhysicalAddress paddr, bool supervisor, bool may_retu { } -void PhysicalPage::return_to_freelist() +void PhysicalPage::return_to_freelist() && { ASSERT((paddr().get() & ~PAGE_MASK) == 0); @@ -32,9 +32,9 @@ void PhysicalPage::return_to_freelist() m_retain_count = 1; if (m_supervisor) - MM.deallocate_supervisor_physical_page(*this); + MM.deallocate_supervisor_physical_page(move(*this)); else - MM.deallocate_user_physical_page(*this); + MM.deallocate_user_physical_page(move(*this)); #ifdef MM_DEBUG dbgprintf("MM: P%x released to freelist\n", m_paddr.get()); diff --git a/Kernel/VM/PhysicalPage.h b/Kernel/VM/PhysicalPage.h index bf2726bcef..5ac8ad7aac 100644 --- a/Kernel/VM/PhysicalPage.h +++ b/Kernel/VM/PhysicalPage.h @@ -23,7 +23,7 @@ public: ASSERT(m_retain_count); if (!--m_retain_count) { if (m_may_return_to_freelist) - return_to_freelist(); + move(*this).return_to_freelist(); else delete this; } @@ -38,7 +38,7 @@ private: PhysicalPage(PhysicalAddress paddr, bool supervisor, bool may_return_to_freelist = true); ~PhysicalPage() {} - void return_to_freelist(); + void return_to_freelist() &&; word m_retain_count { 1 }; bool m_may_return_to_freelist { true }; diff --git a/Kernel/VM/PhysicalRegion.h b/Kernel/VM/PhysicalRegion.h index d4f4fb1934..b14b6daf1a 100644 --- a/Kernel/VM/PhysicalRegion.h +++ b/Kernel/VM/PhysicalRegion.h @@ -25,7 +25,7 @@ public: RetainPtr take_free_page(bool supervisor); void return_page_at(PhysicalAddress addr); - void return_page(PhysicalPage& page) { return_page_at(page.paddr()); } + void return_page(PhysicalPage&& page) { return_page_at(page.paddr()); } private: PhysicalRegion(PhysicalAddress lower, PhysicalAddress upper);