aboutsummaryrefslogtreecommitdiff
path: root/kernel/src/memory/mmio_allocator.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'kernel/src/memory/mmio_allocator.cpp')
-rw-r--r--kernel/src/memory/mmio_allocator.cpp26
1 files changed, 15 insertions, 11 deletions
diff --git a/kernel/src/memory/mmio_allocator.cpp b/kernel/src/memory/mmio_allocator.cpp
index f77f14f..ddbdfc2 100644
--- a/kernel/src/memory/mmio_allocator.cpp
+++ b/kernel/src/memory/mmio_allocator.cpp
@@ -26,21 +26,25 @@ namespace kernel::memory
auto current = m_head;
while (current)
{
- if (current->page_count > count)
+ if (current->is_free && current->page_count >= count)
{
- auto new_base = current->base + (count * kapi::memory::page::size);
- auto split_node = make_node(new_base, current->page_count - count, std::move(current->next), current, true);
-
- if (current->next)
+ if (current->page_count > count)
{
- current->next->previous = split_node;
+ auto new_base = current->base + (count * kapi::memory::page::size);
+ auto split_node = make_node(new_base, current->page_count - count, std::move(current->next), current, true);
+
+ if (current->next)
+ {
+ current->next->previous = split_node;
+ }
+ current->next = split_node;
+ current->page_count = count;
}
- current->next = split_node;
- current->page_count = count;
- }
- current->is_free = false;
- return current->base;
+ current->is_free = false;
+ return current->base;
+ }
+ current = current->next;
}
kapi::system::panic("[OS:MEM] MMIO alloctor out of memory!");