diff options
author | Richard Braun <rbraun@sceen.net> | 2012-12-11 21:43:01 +0100 |
---|---|---|
committer | Richard Braun <rbraun@sceen.net> | 2012-12-11 21:43:01 +0100 |
commit | 6765a1713d16f2388bc97ea99b67a5e752c6ccfe (patch) | |
tree | b3bbc7fe1978c1d37c982f635f16ec47fdbf3537 /vm/vm_map.c | |
parent | 1bf003dc613cca2967ea281f8803600490b55374 (diff) |
vm/vm_map: add locks
Diffstat (limited to 'vm/vm_map.c')
-rw-r--r-- | vm/vm_map.c | 14 |
1 files changed, 13 insertions, 1 deletions
diff --git a/vm/vm_map.c b/vm/vm_map.c index 3ae930f0..a29849ff 100644 --- a/vm/vm_map.c +++ b/vm/vm_map.c @@ -40,6 +40,7 @@ #include <kern/param.h> #include <kern/printk.h> #include <kern/rbtree.h> +#include <kern/spinlock.h> #include <kern/stddef.h> #include <kern/stdint.h> #include <machine/pmap.h> @@ -779,6 +780,8 @@ vm_map_enter(struct vm_map *map, struct vm_object *object, uint64_t offset, struct vm_map_request request; int error; + spinlock_lock(&map->lock); + error = vm_map_prepare(map, object, offset, *startp, size, align, flags, &request); @@ -790,11 +793,14 @@ vm_map_enter(struct vm_map *map, struct vm_object *object, uint64_t offset, if (error) goto error_enter; + spinlock_unlock(&map->lock); + *startp = request.start; return 0; error_enter: vm_map_reset_find_cache(map); + spinlock_unlock(&map->lock); return error; } @@ -855,10 +861,12 @@ vm_map_remove(struct vm_map *map, unsigned long start, unsigned long end) assert(end <= map->end); assert(start < end); + spinlock_lock(&map->lock); + entry = vm_map_lookup_nearest(map, start); if (entry == NULL) - return; + goto out; vm_map_clip_start(map, entry, start); @@ -873,6 +881,9 @@ vm_map_remove(struct vm_map *map, unsigned long start, unsigned long end) } vm_map_reset_find_cache(map); + +out: + spinlock_unlock(&map->lock); } static void @@ -882,6 +893,7 @@ vm_map_init(struct vm_map *map, struct pmap *pmap, unsigned long start, assert(vm_page_aligned(start)); assert(vm_page_aligned(end)); + spinlock_init(&map->lock); list_init(&map->entry_list); rbtree_init(&map->entry_tree); map->nr_entries = 0; |