Skip to content

Commit 1e941fc

Browse files
IdanHolinusg
authored andcommitted
Kernel: Make VirtualRangeAllocator::carve_from_region OOM-fallible
1 parent 85437ab commit 1e941fc

File tree

2 files changed

+7
-6
lines changed

2 files changed

+7
-6
lines changed

Kernel/Memory/VirtualRangeAllocator.cpp

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -44,18 +44,19 @@ void VirtualRangeAllocator::dump() const
4444
}
4545
}
4646

47-
void VirtualRangeAllocator::carve_from_region(VirtualRange const& from, VirtualRange const& range)
47+
ErrorOr<void> VirtualRangeAllocator::carve_from_region(VirtualRange const& from, VirtualRange const& range)
4848
{
4949
VERIFY(m_lock.is_locked());
5050
auto remaining_parts = from.carve(range);
5151
VERIFY(remaining_parts.size() >= 1);
5252
VERIFY(m_total_range.contains(remaining_parts[0]));
5353
m_available_ranges.remove(from.base().get());
54-
m_available_ranges.insert(remaining_parts[0].base().get(), remaining_parts[0]);
54+
TRY(m_available_ranges.try_insert(remaining_parts[0].base().get(), remaining_parts[0]));
5555
if (remaining_parts.size() == 2) {
5656
VERIFY(m_total_range.contains(remaining_parts[1]));
57-
m_available_ranges.insert(remaining_parts[1].base().get(), remaining_parts[1]);
57+
TRY(m_available_ranges.try_insert(remaining_parts[1].base().get(), remaining_parts[1]));
5858
}
59+
return {};
5960
}
6061

6162
ErrorOr<VirtualRange> VirtualRangeAllocator::try_allocate_randomized(size_t size, size_t alignment)
@@ -124,7 +125,7 @@ ErrorOr<VirtualRange> VirtualRangeAllocator::try_allocate_anywhere(size_t size,
124125
m_available_ranges.remove(it.key());
125126
return allocated_range;
126127
}
127-
carve_from_region(*it, allocated_range);
128+
TRY(carve_from_region(*it, allocated_range));
128129
return allocated_range;
129130
}
130131
dmesgln("VirtualRangeAllocator: Failed to allocate anywhere: size={}, alignment={}", size, alignment);
@@ -153,7 +154,7 @@ ErrorOr<VirtualRange> VirtualRangeAllocator::try_allocate_specific(VirtualAddres
153154
m_available_ranges.remove(available_range->base().get());
154155
return allocated_range;
155156
}
156-
carve_from_region(*available_range, allocated_range);
157+
TRY(carve_from_region(*available_range, allocated_range));
157158
return allocated_range;
158159
}
159160

Kernel/Memory/VirtualRangeAllocator.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,7 @@ class VirtualRangeAllocator {
3131
bool contains(VirtualRange const& range) const { return m_total_range.contains(range); }
3232

3333
private:
34-
void carve_from_region(VirtualRange const& from, VirtualRange const&);
34+
ErrorOr<void> carve_from_region(VirtualRange const& from, VirtualRange const&);
3535

3636
RedBlackTree<FlatPtr, VirtualRange> m_available_ranges;
3737
VirtualRange m_total_range;

0 commit comments

Comments
 (0)