summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRichard Braun <rbraun@sceen.net>2017-01-30 00:56:41 +0100
committerRichard Braun <rbraun@sceen.net>2017-01-30 00:56:41 +0100
commit64fab5309b060c9a4ed2b5104af2c447dcd18d2d (patch)
tree5c727a30cada09b04ca842cf835b756d689ff46d
parentfd4c1bc361429fa17cfeb953ec8323bd62053601 (diff)
vm/vm_map: fix map entry linking
I was actually not satisfied enough with the "solution" of commit a90d38274ec139ea8d593373cecccbc59e8fb3f6, so let's really fix this issue.
-rw-r--r--vm/vm_map.c39
1 files changed, 16 insertions, 23 deletions
diff --git a/vm/vm_map.c b/vm/vm_map.c
index f5d6ea28..9bd9d4f4 100644
--- a/vm/vm_map.c
+++ b/vm/vm_map.c
@@ -339,16 +339,14 @@ vm_map_next(struct vm_map *map, struct vm_map_entry *entry)
static void
vm_map_link(struct vm_map *map, struct vm_map_entry *entry,
- struct vm_map_entry *prev, struct vm_map_entry *next)
+ struct vm_map_entry *next)
{
assert(entry->start < entry->end);
- if ((prev == NULL) && (next == NULL)) {
+ if (next == NULL) {
list_insert_tail(&map->entry_list, &entry->list_node);
- } else if (prev == NULL) {
- list_insert_before(&next->list_node, &entry->list_node);
} else {
- list_insert_after(&prev->list_node, &entry->list_node);
+ list_insert_before(&next->list_node, &entry->list_node);
}
rbtree_insert(&map->entry_tree, &entry->tree_node, vm_map_entry_cmp_insert);
@@ -421,7 +419,7 @@ static struct vm_map_entry *
vm_map_try_merge_prev(struct vm_map *map, const struct vm_map_request *request,
struct vm_map_entry *entry)
{
- struct vm_map_entry *prev, *next;
+ struct vm_map_entry *next;
assert(entry != NULL);
@@ -433,11 +431,10 @@ vm_map_try_merge_prev(struct vm_map *map, const struct vm_map_request *request,
return NULL;
}
- prev = vm_map_prev(map, entry);
next = vm_map_next(map, entry);
vm_map_unlink(map, entry);
entry->end += request->size;
- vm_map_link(map, entry, prev, next);
+ vm_map_link(map, entry, next);
return entry;
}
@@ -445,7 +442,7 @@ static struct vm_map_entry *
vm_map_try_merge_next(struct vm_map *map, const struct vm_map_request *request,
struct vm_map_entry *entry)
{
- struct vm_map_entry *prev, *next;
+ struct vm_map_entry *next;
uintptr_t end;
assert(entry != NULL);
@@ -460,11 +457,10 @@ vm_map_try_merge_next(struct vm_map *map, const struct vm_map_request *request,
return NULL;
}
- prev = vm_map_prev(map, entry);
next = vm_map_next(map, entry);
vm_map_unlink(map, entry);
entry->start = request->start;
- vm_map_link(map, entry, prev, next);
+ vm_map_link(map, entry, next);
return entry;
}
@@ -481,15 +477,14 @@ vm_map_try_merge_near(struct vm_map *map, const struct vm_map_request *request,
&& ((request->start + request->size) == second->start)
&& vm_map_try_merge_compatible(request, first)
&& vm_map_try_merge_compatible(request, second)) {
- struct vm_map_entry *prev, *next;
+ struct vm_map_entry *next;
- prev = vm_map_prev(map, first);
next = vm_map_next(map, second);
vm_map_unlink(map, first);
vm_map_unlink(map, second);
first->end = second->end;
vm_map_entry_destroy(second);
- vm_map_link(map, first, prev, next);
+ vm_map_link(map, first, next);
return first;
}
@@ -558,7 +553,7 @@ vm_map_insert(struct vm_map *map, struct vm_map_entry *entry,
entry->object = request->object;
entry->offset = request->offset;
entry->flags = request->flags & VM_MAP_ENTRY_MASK;
- vm_map_link(map, entry, NULL, request->next);
+ vm_map_link(map, entry, request->next);
out:
map->size += request->size;
@@ -618,39 +613,37 @@ static void
vm_map_clip_start(struct vm_map *map, struct vm_map_entry *entry,
uintptr_t start)
{
- struct vm_map_entry *new_entry, *prev, *next;
+ struct vm_map_entry *new_entry, *next;
if ((start <= entry->start) || (start >= entry->end)) {
return;
}
- prev = vm_map_prev(map, entry);
next = vm_map_next(map, entry);
vm_map_unlink(map, entry);
new_entry = vm_map_entry_create();
*new_entry = *entry;
vm_map_split_entries(new_entry, entry, start);
- vm_map_link(map, entry, prev, next);
- vm_map_link(map, new_entry, prev, entry);
+ vm_map_link(map, entry, next);
+ vm_map_link(map, new_entry, entry);
}
static void
vm_map_clip_end(struct vm_map *map, struct vm_map_entry *entry, uintptr_t end)
{
- struct vm_map_entry *new_entry, *prev, *next;
+ struct vm_map_entry *new_entry, *next;
if ((end <= entry->start) || (end >= entry->end)) {
return;
}
- prev = vm_map_prev(map, entry);
next = vm_map_next(map, entry);
vm_map_unlink(map, entry);
new_entry = vm_map_entry_create();
*new_entry = *entry;
vm_map_split_entries(entry, new_entry, end);
- vm_map_link(map, entry, prev, next);
- vm_map_link(map, new_entry, entry, next);
+ vm_map_link(map, entry, next);
+ vm_map_link(map, new_entry, next);
}
void