aboutsummaryrefslogtreecommitdiff
path: root/common/mem_regions.c
diff options
context:
space:
mode:
authorKimplul <kimi.h.kuparinen@gmail.com>2022-05-22 15:05:39 +0300
committerKimplul <kimi.h.kuparinen@gmail.com>2022-05-22 15:05:39 +0300
commit5793a61eb824a7b97e9bab5913b595a778205cef (patch)
treef31931b924058cb6474b80cd02472940ad8cfcd5 /common/mem_regions.c
parenta4851206bef5ceecef18b3fde5be6918a67cca21 (diff)
downloadkmi-5793a61eb824a7b97e9bab5913b595a778205cef.tar.gz
kmi-5793a61eb824a7b97e9bab5913b595a778205cef.zip
improved tcb handling in preparation for processes
Diffstat (limited to 'common/mem_regions.c')
-rw-r--r--common/mem_regions.c34
1 files changed, 25 insertions, 9 deletions
diff --git a/common/mem_regions.c b/common/mem_regions.c
index bbc894e..9f8f98e 100644
--- a/common/mem_regions.c
+++ b/common/mem_regions.c
@@ -6,7 +6,6 @@
#define mark_region_used(r) __set_bit(r, MR_USED)
#define mark_region_unused(r) __clear_bit(r, MR_USED)
-#define region_used(r) __is_set(r, MR_USED)
/* pretty major slowdown when we get to some really massive numbers, not
* entirely sure why. Will need to check up on this at some point, have I
@@ -121,17 +120,22 @@ static void __destroy_region(struct sp_node *n)
if (!n)
return;
- __destroy_region(sp_left(n));
- __destroy_region(sp_right(n));
+ if (sp_left(n))
+ __destroy_region(sp_left(n));
+
+ if (sp_right(n))
+ __destroy_region(sp_right(n));
struct mem_region *m = mem_container(n);
free_mem_node(m);
}
-void destroy_region(struct mem_region_root *r)
+stat_t destroy_region(struct mem_region_root *r)
{
__destroy_region(sp_root(&r->free_regions));
__destroy_region(sp_root(&r->used_regions));
+ /* TODO: error checking? */
+ return OK;
}
/* interestingly this is now the main bottleneck :D
@@ -245,6 +249,18 @@ struct mem_region *find_free_region(struct mem_region_root *r, size_t size,
return quick_best;
}
+struct mem_region *find_first_region(struct mem_region_root *r)
+{
+ /* get used region with smallest address, likely also close to the start
+ * of the linked list */
+ struct mem_region *m = find_closest_used_region(r, 0);
+ while (m->prev) {
+ m = m->prev;
+ }
+
+ return m;
+}
+
static vm_t __partition_region(struct mem_region_root *r, struct mem_region *m,
size_t pages, size_t align, vmflags_t flags)
{
@@ -332,7 +348,7 @@ vm_t alloc_fixed_region(struct mem_region_root *r, vm_t start, size_t size,
}
/* if region is already in use, forget it */
- if (region_used(m->flags))
+ if (is_region_used(m))
return 0;
/* region is too small */
@@ -346,11 +362,11 @@ vm_t alloc_fixed_region(struct mem_region_root *r, vm_t start, size_t size,
static void __try_coalesce_prev(struct mem_region_root *r, struct mem_region *m)
{
while (m) {
- if (!m || region_used(m->flags))
+ if (!m || is_region_used(m))
return;
struct mem_region *p = m->prev;
- if (!p || region_used(p->flags))
+ if (!p || is_region_used(p))
return;
m->start = p->start;
@@ -369,11 +385,11 @@ static void __try_coalesce_prev(struct mem_region_root *r, struct mem_region *m)
static void __try_coalesce_next(struct mem_region_root *r, struct mem_region *m)
{
while (m) {
- if (!m || region_used(m->flags))
+ if (!m || is_region_used(m))
return;
struct mem_region *n = m->next;
- if (!n || region_used(n->flags))
+ if (!n || is_region_used(n))
return;
m->end = n->end;