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) | ||||
| { | ||||
|     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(), | ||||
|  |  | |||
|  | @ -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<FlatPtr, Region*> m_kernel_regions; | ||||
| 
 | ||||
|     Vector<UsedMemoryRange> m_used_memory_ranges; | ||||
|     Vector<PhysicalMemoryRange> m_physical_memory_ranges; | ||||
|     Vector<ContiguousReservedMemoryRange> m_reserved_memory_ranges; | ||||
|  |  | |||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue
	
	 Andreas Kling
						Andreas Kling