1
Fork 0
mirror of https://github.com/RGBCube/serenity synced 2025-07-26 04:47:34 +00:00

Kernel: Add RegionTree::remove(Region&)

This allows clients to remove a region from the tree without reaching
into the RegionTree internals.
This commit is contained in:
Andreas Kling 2022-04-05 11:57:53 +02:00
parent 4b5a9bab34
commit da7ea2556e
4 changed files with 10 additions and 6 deletions

View file

@ -229,9 +229,7 @@ void AddressSpace::deallocate_region(Region& region)
NonnullOwnPtr<Region> AddressSpace::take_region(Region& region) NonnullOwnPtr<Region> AddressSpace::take_region(Region& region)
{ {
SpinlockLocker lock(m_lock); auto did_remove = m_region_tree.remove(region);
SpinlockLocker tree_locker(m_region_tree.get_lock());
auto did_remove = m_region_tree.regions().remove(region.vaddr().get());
VERIFY(did_remove); VERIFY(did_remove);
return NonnullOwnPtr { NonnullOwnPtr<Region>::Adopt, region }; return NonnullOwnPtr { NonnullOwnPtr<Region>::Adopt, region };
} }

View file

@ -1168,9 +1168,7 @@ bool MemoryManager::validate_user_stack(AddressSpace& space, VirtualAddress vadd
void MemoryManager::unregister_kernel_region(Region& region) void MemoryManager::unregister_kernel_region(Region& region)
{ {
VERIFY(region.is_kernel()); VERIFY(region.is_kernel());
SpinlockLocker lock(s_mm_lock); m_region_tree.remove(region);
SpinlockLocker tree_locker(m_region_tree.get_lock());
m_region_tree.regions().remove(region.vaddr().get());
} }
void MemoryManager::dump_kernel_regions() void MemoryManager::dump_kernel_regions()

View file

@ -164,4 +164,10 @@ ErrorOr<NonnullOwnPtr<Memory::Region>> RegionTree::create_identity_mapped_region
return region; return region;
} }
bool RegionTree::remove(Region& region)
{
SpinlockLocker locker(m_lock);
return m_regions.remove(region.range().base().get());
}
} }

View file

@ -52,6 +52,8 @@ public:
// FIXME: Access the region tree through a SpinlockProtected or similar. // FIXME: Access the region tree through a SpinlockProtected or similar.
RecursiveSpinlock& get_lock() const { return m_lock; } RecursiveSpinlock& get_lock() const { return m_lock; }
bool remove(Region&);
private: private:
ErrorOr<VirtualRange> allocate_range_anywhere(size_t size, size_t alignment = PAGE_SIZE); ErrorOr<VirtualRange> allocate_range_anywhere(size_t size, size_t alignment = PAGE_SIZE);
ErrorOr<VirtualRange> allocate_range_specific(VirtualAddress base, size_t size); ErrorOr<VirtualRange> allocate_range_specific(VirtualAddress base, size_t size);