summaryrefslogtreecommitdiff
path: root/kernel/lib/kalloc.c
diff options
context:
space:
mode:
authorFreya Murphy <freya@freyacat.org>2025-05-02 12:37:40 -0400
committerFreya Murphy <freya@freyacat.org>2025-05-02 12:37:40 -0400
commitd5a0abc2fe0ab570ab9e0de9607fec1e951cb933 (patch)
treef4993bb1f1eaeea75797b37464ea248da466508f /kernel/lib/kalloc.c
parentchanges idk (diff)
downloadcomus-d5a0abc2fe0ab570ab9e0de9607fec1e951cb933.tar.gz
comus-d5a0abc2fe0ab570ab9e0de9607fec1e951cb933.tar.bz2
comus-d5a0abc2fe0ab570ab9e0de9607fec1e951cb933.zip
temp badness
Diffstat (limited to 'kernel/lib/kalloc.c')
-rw-r--r--kernel/lib/kalloc.c44
1 files changed, 26 insertions, 18 deletions
diff --git a/kernel/lib/kalloc.c b/kernel/lib/kalloc.c
index 8dca46b..f4cd097 100644
--- a/kernel/lib/kalloc.c
+++ b/kernel/lib/kalloc.c
@@ -35,8 +35,7 @@ static struct page_header *get_header(void *ptr)
static void *alloc_new(size_t size)
{
- size_t pages =
- ((size + header_len + PAGE_SIZE - 1) / PAGE_SIZE) * PAGE_SIZE;
+ size_t pages = ((size + header_len + PAGE_SIZE - 1) / PAGE_SIZE);
void *addr = kalloc_pages(pages);
void *mem = (char *)addr + header_len;
@@ -91,6 +90,8 @@ static void *alloc_block(size_t size, struct page_header *block)
header->prev = block;
header->next = block->next;
block->next = header;
+ if (header->next)
+ header->next->prev = header;
header->node_number = block->node_number;
void *mem = (char *)header + header_len;
@@ -163,7 +164,7 @@ void *krealloc(void *src, size_t dst_len)
void kfree(void *ptr)
{
- struct page_header *header;
+ struct page_header *header, *neighbor;
if (ptr == NULL)
return;
@@ -176,17 +177,17 @@ void kfree(void *ptr)
header->free += header->used;
header->used = 0;
- struct page_header *neighbor;
-
// merge left
for (neighbor = header->prev; neighbor != NULL; neighbor = neighbor->prev) {
if (neighbor->node_number != header->node_number)
break;
- if (neighbor->used || header->used)
- break;
neighbor->free += header->free + header_len;
neighbor->next = header->next;
+ if (neighbor->next)
+ neighbor->next->prev = neighbor;
header = neighbor;
+ if (header->used)
+ break;
}
// merge right
@@ -197,17 +198,24 @@ void kfree(void *ptr)
break;
header->free += neighbor->free + header_len;
header->next = neighbor->next;
- }
-
- if ((header->next == NULL ||
- header->next->node_number != header->node_number) &&
- (header->prev == NULL ||
- header->prev->node_number != header->node_number) &&
- header->used == 0) {
if (header->next)
- header->next->prev = header->prev;
- if (header->prev)
- header->prev->next = header->next;
- kfree_pages(header);
+ header->next->prev = header;
}
+
+ // ignore if node on left
+ if (header->prev != NULL &&
+ header->prev->node_number == header->node_number)
+ return;
+
+ // ignore if node on right
+ if (header->next != NULL &&
+ header->next->node_number == header->node_number)
+ return;
+
+ // ignore if still used
+ if (header->used)
+ return;
+
+ // FIXME: huh?!
+ // kfree_pages(header);
}