Skip to content

Commit df34f7b

Browse files
committed
Kernel: Use an IntrusiveRedBlackTree for kernel regions
We were already using a non-intrusive RedBlackTree, and since the kernel regions tree is non-owning, this is a trivial conversion that makes a bunch of the tree operations infallible (by being allocation-free.) :^)
1 parent 66e72ed commit df34f7b

File tree

3 files changed

+13
-12
lines changed

3 files changed

+13
-12
lines changed

Kernel/Memory/MemoryManager.cpp

Lines changed: 6 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/*
2-
* Copyright (c) 2018-2021, Andreas Kling <kling@serenityos.org>
2+
* Copyright (c) 2018-2022, Andreas Kling <kling@serenityos.org>
33
*
44
* SPDX-License-Identifier: BSD-2-Clause
55
*/
@@ -645,10 +645,10 @@ UNMAP_AFTER_INIT void MemoryManager::initialize(u32 cpu)
645645
Region* MemoryManager::kernel_region_from_vaddr(VirtualAddress vaddr)
646646
{
647647
SpinlockLocker lock(s_mm_lock);
648-
auto* region_ptr = MM.m_kernel_regions.find_largest_not_above(vaddr.get());
649-
if (!region_ptr)
648+
auto* region = MM.m_kernel_regions.find_largest_not_above(vaddr.get());
649+
if (!region || !region->contains(vaddr))
650650
return nullptr;
651-
return (*region_ptr)->contains(vaddr) ? *region_ptr : nullptr;
651+
return region;
652652
}
653653

654654
Region* MemoryManager::find_user_region_from_vaddr_no_lock(AddressSpace& space, VirtualAddress vaddr)
@@ -1111,7 +1111,7 @@ void MemoryManager::register_kernel_region(Region& region)
11111111
{
11121112
VERIFY(region.is_kernel());
11131113
SpinlockLocker lock(s_mm_lock);
1114-
m_kernel_regions.insert(region.vaddr().get(), &region);
1114+
m_kernel_regions.insert(region.vaddr().get(), region);
11151115
}
11161116

11171117
void MemoryManager::unregister_kernel_region(Region& region)
@@ -1132,8 +1132,7 @@ void MemoryManager::dump_kernel_regions()
11321132
dbgln("BEGIN{} END{} SIZE{} ACCESS NAME",
11331133
addr_padding, addr_padding, addr_padding);
11341134
SpinlockLocker lock(s_mm_lock);
1135-
for (auto const* region_ptr : m_kernel_regions) {
1136-
auto const& region = *region_ptr;
1135+
for (auto const& region : m_kernel_regions) {
11371136
dbgln("{:p} -- {:p} {:p} {:c}{:c}{:c}{:c}{:c}{:c} {}",
11381137
region.vaddr().get(),
11391138
region.vaddr().offset(region.size() - 1).get(),

Kernel/Memory/MemoryManager.h

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/*
2-
* Copyright (c) 2018-2020, Andreas Kling <kling@serenityos.org>
2+
* Copyright (c) 2018-2022, Andreas Kling <kling@serenityos.org>
33
*
44
* SPDX-License-Identifier: BSD-2-Clause
55
*/
@@ -8,6 +8,7 @@
88

99
#include <AK/Concepts.h>
1010
#include <AK/HashTable.h>
11+
#include <AK/IntrusiveRedBlackTree.h>
1112
#include <AK/NonnullOwnPtrVector.h>
1213
#include <AK/NonnullRefPtrVector.h>
1314
#include <Kernel/Forward.h>
@@ -293,7 +294,7 @@ class MemoryManager {
293294
PhysicalPageEntry* m_physical_page_entries { nullptr };
294295
size_t m_physical_page_entries_count { 0 };
295296

296-
RedBlackTree<FlatPtr, Region*> m_kernel_regions;
297+
IntrusiveRedBlackTree<&Region::m_tree_node> m_kernel_regions;
297298

298299
Vector<UsedMemoryRange> m_used_memory_ranges;
299300
Vector<PhysicalMemoryRange> m_physical_memory_ranges;

Kernel/Memory/Region.h

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/*
2-
* Copyright (c) 2018-2020, Andreas Kling <kling@serenityos.org>
2+
* Copyright (c) 2018-2022, Andreas Kling <kling@serenityos.org>
33
*
44
* SPDX-License-Identifier: BSD-2-Clause
55
*/
@@ -8,6 +8,7 @@
88

99
#include <AK/EnumBits.h>
1010
#include <AK/IntrusiveList.h>
11+
#include <AK/IntrusiveRedBlackTree.h>
1112
#include <AK/Weakable.h>
1213
#include <Kernel/Forward.h>
1314
#include <Kernel/KString.h>
@@ -219,11 +220,11 @@ class Region final
219220
bool m_stack : 1 { false };
220221
bool m_mmap : 1 { false };
221222
bool m_syscall_region : 1 { false };
222-
IntrusiveListNode<Region> m_memory_manager_list_node;
223+
224+
IntrusiveRedBlackTreeNode<FlatPtr, Region, RawPtr<Region>> m_tree_node;
223225
IntrusiveListNode<Region> m_vmobject_list_node;
224226

225227
public:
226-
using ListInMemoryManager = IntrusiveList<&Region::m_memory_manager_list_node>;
227228
using ListInVMObject = IntrusiveList<&Region::m_vmobject_list_node>;
228229
};
229230

0 commit comments

Comments
 (0)