1
Fork 0
mirror of https://github.com/RGBCube/serenity synced 2025-07-25 04:27:43 +00:00

Kernel: Store kernel memory regions in a RedBlackTree

We were already doing this for userspace memory regions (in the
Memory::AddressSpace class), so let's do it for kernel regions as well.

This gives a nice speed-up on test-js and probably basically everything
else as well. :^)
This commit is contained in:
Andreas Kling 2021-12-11 18:31:56 +01:00
parent 6d9a1d3c93
commit a23edd42b8
2 changed files with 10 additions and 9 deletions

View file

@ -620,11 +620,10 @@ UNMAP_AFTER_INIT void MemoryManager::initialize(u32 cpu)
Region* MemoryManager::kernel_region_from_vaddr(VirtualAddress vaddr) Region* MemoryManager::kernel_region_from_vaddr(VirtualAddress vaddr)
{ {
SpinlockLocker lock(s_mm_lock); SpinlockLocker lock(s_mm_lock);
for (auto& region : MM.m_kernel_regions) { auto* region_ptr = MM.m_kernel_regions.find_largest_not_above(vaddr.get());
if (region.contains(vaddr)) if (!region_ptr)
return &region; return nullptr;
} return *region_ptr;
return nullptr;
} }
Region* MemoryManager::find_user_region_from_vaddr_no_lock(AddressSpace& space, VirtualAddress vaddr) Region* MemoryManager::find_user_region_from_vaddr_no_lock(AddressSpace& space, VirtualAddress vaddr)
@ -1051,14 +1050,14 @@ void MemoryManager::register_region(Region& region)
{ {
SpinlockLocker lock(s_mm_lock); SpinlockLocker lock(s_mm_lock);
if (region.is_kernel()) if (region.is_kernel())
m_kernel_regions.append(region); m_kernel_regions.insert(region.vaddr().get(), &region);
} }
void MemoryManager::unregister_region(Region& region) void MemoryManager::unregister_region(Region& region)
{ {
SpinlockLocker lock(s_mm_lock); SpinlockLocker lock(s_mm_lock);
if (region.is_kernel()) if (region.is_kernel())
m_kernel_regions.remove(region); m_kernel_regions.remove(region.vaddr().get());
} }
void MemoryManager::dump_kernel_regions() void MemoryManager::dump_kernel_regions()
@ -1072,7 +1071,8 @@ void MemoryManager::dump_kernel_regions()
dbgln("BEGIN{} END{} SIZE{} ACCESS NAME", dbgln("BEGIN{} END{} SIZE{} ACCESS NAME",
addr_padding, addr_padding, addr_padding); addr_padding, addr_padding, addr_padding);
SpinlockLocker lock(s_mm_lock); SpinlockLocker lock(s_mm_lock);
for (auto& region : m_kernel_regions) { for (auto* region_ptr : m_kernel_regions) {
auto& region = *region_ptr;
dbgln("{:p} -- {:p} {:p} {:c}{:c}{:c}{:c}{:c}{:c} {}", dbgln("{:p} -- {:p} {:p} {:c}{:c}{:c}{:c}{:c}{:c} {}",
region.vaddr().get(), region.vaddr().get(),
region.vaddr().offset(region.size() - 1).get(), region.vaddr().offset(region.size() - 1).get(),

View file

@ -292,7 +292,8 @@ private:
PhysicalPageEntry* m_physical_page_entries { nullptr }; PhysicalPageEntry* m_physical_page_entries { nullptr };
size_t m_physical_page_entries_count { 0 }; size_t m_physical_page_entries_count { 0 };
Region::ListInMemoryManager m_kernel_regions; RedBlackTree<FlatPtr, Region*> m_kernel_regions;
Vector<UsedMemoryRange> m_used_memory_ranges; Vector<UsedMemoryRange> m_used_memory_ranges;
Vector<PhysicalMemoryRange> m_physical_memory_ranges; Vector<PhysicalMemoryRange> m_physical_memory_ranges;
Vector<ContiguousReservedMemoryRange> m_reserved_memory_ranges; Vector<ContiguousReservedMemoryRange> m_reserved_memory_ranges;