mirror of
https://github.com/Mathewnd/Astral.git
synced 2026-10-31 14:38:21 +00:00
mm: added page fault range caching for each mm_space_t
mm: added last_pagefault handling when mm_space_t is unmapped mm: fixed styling inconsistencies, fixed last pagefault range removal mm: fix unitialized last_pagefault member in slab data
This commit is contained in:
@@ -46,6 +46,8 @@ typedef struct {
|
|||||||
rbtree_t *ranges;
|
rbtree_t *ranges;
|
||||||
void *start;
|
void *start;
|
||||||
void *end;
|
void *end;
|
||||||
|
|
||||||
|
mm_range_t *last_pagefault;
|
||||||
} mm_space_t;
|
} mm_space_t;
|
||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
|
|||||||
+15
-2
@@ -273,7 +273,13 @@ bool mm_handle_page_fault(void *addr, bool user, int actions) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
MUTEX_ACQUIRE(&space->lock);
|
MUTEX_ACQUIRE(&space->lock);
|
||||||
mm_range_t *range = mm_get_range(space, addr);
|
|
||||||
|
// we look at the last page fault range and check if the address is in this range
|
||||||
|
// this might avoid a more expensive tree lookup
|
||||||
|
mm_range_t *range = space->last_pagefault;
|
||||||
|
if (range == NULL || range->start > addr || addr >= range->start + range->size) {
|
||||||
|
range = mm_get_range(space, addr);
|
||||||
|
}
|
||||||
|
|
||||||
bool status = false;
|
bool status = false;
|
||||||
|
|
||||||
@@ -282,6 +288,8 @@ bool mm_handle_page_fault(void *addr, bool user, int actions) {
|
|||||||
goto cleanup;
|
goto cleanup;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
space->last_pagefault = range;
|
||||||
|
|
||||||
// check if valid
|
// check if valid
|
||||||
|
|
||||||
int invalid_actions = 0;
|
int invalid_actions = 0;
|
||||||
@@ -486,8 +494,12 @@ void *mm_map(void *addr, volatile size_t size, int flags, mmuflags_t mmuflags, v
|
|||||||
|
|
||||||
mm_insert_range(space, range);
|
mm_insert_range(space, range);
|
||||||
cleanup:
|
cleanup:
|
||||||
if (ret_addr == NULL && range)
|
if (ret_addr == NULL && range) {
|
||||||
|
if (space->last_pagefault == range)
|
||||||
|
space->last_pagefault = NULL;
|
||||||
|
|
||||||
mm_free_range(range);
|
mm_free_range(range);
|
||||||
|
}
|
||||||
|
|
||||||
MUTEX_RELEASE(&space->lock);
|
MUTEX_RELEASE(&space->lock);
|
||||||
return ret_addr;
|
return ret_addr;
|
||||||
@@ -547,6 +559,7 @@ mm_context_t *mm_create_context() {
|
|||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
ctx->space.last_pagefault = NULL;
|
||||||
return ctx;
|
return ctx;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
+11
-1
@@ -122,6 +122,9 @@ void mm_insert_range(mm_space_t *space, mm_range_t *new_range) {
|
|||||||
if (next_range && ranges_compatible(new_range, next_range)) {
|
if (next_range && ranges_compatible(new_range, next_range)) {
|
||||||
new_range->size += next_range->size;
|
new_range->size += next_range->size;
|
||||||
|
|
||||||
|
if (space->last_pagefault == next_range)
|
||||||
|
space->last_pagefault = NULL;
|
||||||
|
|
||||||
rbtree_remove(&space->ranges, &next_range->rbtree_node);
|
rbtree_remove(&space->ranges, &next_range->rbtree_node);
|
||||||
mm_free_range(next_range);
|
mm_free_range(next_range);
|
||||||
if (new_range->flags & MM_RANGE_FLAGS_FILE) {
|
if (new_range->flags & MM_RANGE_FLAGS_FILE) {
|
||||||
@@ -133,6 +136,9 @@ void mm_insert_range(mm_space_t *space, mm_range_t *new_range) {
|
|||||||
if (prev_range && ranges_compatible(prev_range, new_range)) {
|
if (prev_range && ranges_compatible(prev_range, new_range)) {
|
||||||
prev_range->size += new_range->size;
|
prev_range->size += new_range->size;
|
||||||
|
|
||||||
|
if (space->last_pagefault == new_range)
|
||||||
|
space->last_pagefault = NULL;
|
||||||
|
|
||||||
rbtree_remove(&space->ranges, &new_range->rbtree_node);
|
rbtree_remove(&space->ranges, &new_range->rbtree_node);
|
||||||
mm_free_range(new_range);
|
mm_free_range(new_range);
|
||||||
if (prev_range->flags & MM_RANGE_FLAGS_FILE) {
|
if (prev_range->flags & MM_RANGE_FLAGS_FILE) {
|
||||||
@@ -382,6 +388,9 @@ int mm_change_range(mm_space_t *space, void *address, size_t size, bool free, in
|
|||||||
|
|
||||||
// remove or change the flags of the range
|
// remove or change the flags of the range
|
||||||
if (free) {
|
if (free) {
|
||||||
|
if (space->last_pagefault == range)
|
||||||
|
space->last_pagefault = NULL;
|
||||||
|
|
||||||
rbtree_remove(&space->ranges, &range->rbtree_node);
|
rbtree_remove(&space->ranges, &range->rbtree_node);
|
||||||
mm_destroy_range(range, 0, range->size, 0);
|
mm_destroy_range(range, 0, range->size, 0);
|
||||||
mm_free_range(range);
|
mm_free_range(range);
|
||||||
@@ -410,8 +419,9 @@ int mm_change_range(mm_space_t *space, void *address, size_t size, bool free, in
|
|||||||
}
|
}
|
||||||
|
|
||||||
size_t difference = (uintptr_t)top - (uintptr_t)range->start;
|
size_t difference = (uintptr_t)top - (uintptr_t)range->start;
|
||||||
if (free)
|
if (free) {
|
||||||
mm_destroy_range(range, 0, difference, 0);
|
mm_destroy_range(range, 0, difference, 0);
|
||||||
|
}
|
||||||
|
|
||||||
range->start = (void *)((uintptr_t)range->start + difference);
|
range->start = (void *)((uintptr_t)range->start + difference);
|
||||||
range->size -= difference;
|
range->size -= difference;
|
||||||
|
|||||||
Reference in New Issue
Block a user