mirror of
				https://github.com/RGBCube/serenity
				synced 2025-10-31 09:52:44 +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:
		
							parent
							
								
									6d9a1d3c93
								
							
						
					
					
						commit
						a23edd42b8
					
				
					 2 changed files with 10 additions and 9 deletions
				
			
		|  | @ -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 ®ion; |         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(), ®ion); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| 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(), | ||||||
|  |  | ||||||
|  | @ -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; | ||||||
|  |  | ||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue
	
	 Andreas Kling
						Andreas Kling