Browse Source

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. :^)
Andreas Kling 3 years ago
parent
commit
a23edd42b8
2 changed files with 10 additions and 9 deletions
  1. 8 8
      Kernel/Memory/MemoryManager.cpp
  2. 2 1
      Kernel/Memory/MemoryManager.h

+ 8 - 8
Kernel/Memory/MemoryManager.cpp

@@ -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) {
-        if (region.contains(vaddr))
-            return &region;
-    }
-    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)
 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(),

+ 2 - 1
Kernel/Memory/MemoryManager.h

@@ -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;