From a23edd42b869a16e11f4d6ca9071d6b570dc219c Mon Sep 17 00:00:00 2001 From: Andreas Kling Date: Sat, 11 Dec 2021 18:31:56 +0100 Subject: [PATCH] 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. :^) --- Kernel/Memory/MemoryManager.cpp | 16 ++++++++-------- Kernel/Memory/MemoryManager.h | 3 ++- 2 files changed, 10 insertions(+), 9 deletions(-) diff --git a/Kernel/Memory/MemoryManager.cpp b/Kernel/Memory/MemoryManager.cpp index 54b0adfb01..81f5da7c1d 100644 --- a/Kernel/Memory/MemoryManager.cpp +++ b/Kernel/Memory/MemoryManager.cpp @@ -620,11 +620,10 @@ UNMAP_AFTER_INIT void MemoryManager::initialize(u32 cpu) Region* MemoryManager::kernel_region_from_vaddr(VirtualAddress vaddr) { SpinlockLocker lock(s_mm_lock); - for (auto& region : MM.m_kernel_regions) { - if (region.contains(vaddr)) - return ®ion; - } - return nullptr; + auto* region_ptr = MM.m_kernel_regions.find_largest_not_above(vaddr.get()); + if (!region_ptr) + return nullptr; + return *region_ptr; } 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); if (region.is_kernel()) - m_kernel_regions.append(region); + m_kernel_regions.insert(region.vaddr().get(), ®ion); } void MemoryManager::unregister_region(Region& region) { SpinlockLocker lock(s_mm_lock); if (region.is_kernel()) - m_kernel_regions.remove(region); + m_kernel_regions.remove(region.vaddr().get()); } void MemoryManager::dump_kernel_regions() @@ -1072,7 +1071,8 @@ void MemoryManager::dump_kernel_regions() dbgln("BEGIN{} END{} SIZE{} ACCESS NAME", addr_padding, addr_padding, addr_padding); 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} {}", region.vaddr().get(), region.vaddr().offset(region.size() - 1).get(), diff --git a/Kernel/Memory/MemoryManager.h b/Kernel/Memory/MemoryManager.h index 69ea905391..115dd37f56 100644 --- a/Kernel/Memory/MemoryManager.h +++ b/Kernel/Memory/MemoryManager.h @@ -292,7 +292,8 @@ private: PhysicalPageEntry* m_physical_page_entries { nullptr }; size_t m_physical_page_entries_count { 0 }; - Region::ListInMemoryManager m_kernel_regions; + RedBlackTree m_kernel_regions; + Vector m_used_memory_ranges; Vector m_physical_memory_ranges; Vector m_reserved_memory_ranges;