From da7ea2556e2dc2b027609feec35204b12693afd4 Mon Sep 17 00:00:00 2001 From: Andreas Kling Date: Tue, 5 Apr 2022 11:57:53 +0200 Subject: [PATCH] Kernel: Add RegionTree::remove(Region&) This allows clients to remove a region from the tree without reaching into the RegionTree internals. --- Kernel/Memory/AddressSpace.cpp | 4 +--- Kernel/Memory/MemoryManager.cpp | 4 +--- Kernel/Memory/RegionTree.cpp | 6 ++++++ Kernel/Memory/RegionTree.h | 2 ++ 4 files changed, 10 insertions(+), 6 deletions(-) diff --git a/Kernel/Memory/AddressSpace.cpp b/Kernel/Memory/AddressSpace.cpp index d4cd3bafad..5e84decbdd 100644 --- a/Kernel/Memory/AddressSpace.cpp +++ b/Kernel/Memory/AddressSpace.cpp @@ -229,9 +229,7 @@ void AddressSpace::deallocate_region(Region& region) NonnullOwnPtr AddressSpace::take_region(Region& region) { - SpinlockLocker lock(m_lock); - SpinlockLocker tree_locker(m_region_tree.get_lock()); - auto did_remove = m_region_tree.regions().remove(region.vaddr().get()); + auto did_remove = m_region_tree.remove(region); VERIFY(did_remove); return NonnullOwnPtr { NonnullOwnPtr::Adopt, region }; } diff --git a/Kernel/Memory/MemoryManager.cpp b/Kernel/Memory/MemoryManager.cpp index 7bce3b3504..9384fa6a98 100644 --- a/Kernel/Memory/MemoryManager.cpp +++ b/Kernel/Memory/MemoryManager.cpp @@ -1168,9 +1168,7 @@ bool MemoryManager::validate_user_stack(AddressSpace& space, VirtualAddress vadd void MemoryManager::unregister_kernel_region(Region& region) { VERIFY(region.is_kernel()); - SpinlockLocker lock(s_mm_lock); - SpinlockLocker tree_locker(m_region_tree.get_lock()); - m_region_tree.regions().remove(region.vaddr().get()); + m_region_tree.remove(region); } void MemoryManager::dump_kernel_regions() diff --git a/Kernel/Memory/RegionTree.cpp b/Kernel/Memory/RegionTree.cpp index ecbac58d2f..ed0baa952c 100644 --- a/Kernel/Memory/RegionTree.cpp +++ b/Kernel/Memory/RegionTree.cpp @@ -164,4 +164,10 @@ ErrorOr> RegionTree::create_identity_mapped_region return region; } +bool RegionTree::remove(Region& region) +{ + SpinlockLocker locker(m_lock); + return m_regions.remove(region.range().base().get()); +} + } diff --git a/Kernel/Memory/RegionTree.h b/Kernel/Memory/RegionTree.h index f94892d583..d55b52affb 100644 --- a/Kernel/Memory/RegionTree.h +++ b/Kernel/Memory/RegionTree.h @@ -52,6 +52,8 @@ public: // FIXME: Access the region tree through a SpinlockProtected or similar. RecursiveSpinlock& get_lock() const { return m_lock; } + bool remove(Region&); + private: ErrorOr allocate_range_anywhere(size_t size, size_t alignment = PAGE_SIZE); ErrorOr allocate_range_specific(VirtualAddress base, size_t size);