diff options
author | alc <alc@FreeBSD.org> | 2002-04-28 06:07:54 +0000 |
---|---|---|
committer | alc <alc@FreeBSD.org> | 2002-04-28 06:07:54 +0000 |
commit | dc5b6882d314d270e5a57ba165792772e0ec4da7 (patch) | |
tree | cfed2f78df18ec91b4eea400ce4de416ed94a583 /sys/vm | |
parent | 1fc70fcb7789be34cae6201ab9c71fc4c9945e60 (diff) | |
download | FreeBSD-src-dc5b6882d314d270e5a57ba165792772e0ec4da7.zip FreeBSD-src-dc5b6882d314d270e5a57ba165792772e0ec4da7.tar.gz |
o Introduce and use vm_map_trylock() to replace several direct uses
of lockmgr().
o Add missing synchronization to vmspace_swap_count(): Obtain a read lock
on the vm_map before traversing it.
Diffstat (limited to 'sys/vm')
-rw-r--r-- | sys/vm/vm_fault.c | 4 | ||||
-rw-r--r-- | sys/vm/vm_glue.c | 4 | ||||
-rw-r--r-- | sys/vm/vm_map.c | 10 | ||||
-rw-r--r-- | sys/vm/vm_map.h | 1 | ||||
-rw-r--r-- | sys/vm/vm_pageout.c | 3 |
5 files changed, 14 insertions, 8 deletions
diff --git a/sys/vm/vm_fault.c b/sys/vm/vm_fault.c index 1558f62..757f573 100644 --- a/sys/vm/vm_fault.c +++ b/sys/vm/vm_fault.c @@ -663,9 +663,7 @@ readrest: /* * grab the lock if we need to */ - (fs.lookup_still_valid || - lockmgr(&fs.map->lock, LK_EXCLUSIVE|LK_NOWAIT, (void *)0, curthread) == 0) - ) { + (fs.lookup_still_valid || vm_map_trylock(fs.map))) { fs.lookup_still_valid = 1; /* diff --git a/sys/vm/vm_glue.c b/sys/vm/vm_glue.c index 2adbb4a..66eaa6b 100644 --- a/sys/vm/vm_glue.c +++ b/sys/vm/vm_glue.c @@ -560,9 +560,7 @@ retry: * data structures there is a * possible deadlock. */ - if (lockmgr(&vm->vm_map.lock, - LK_EXCLUSIVE | LK_NOWAIT, - NULL, curthread)) { + if (!vm_map_trylock(&vm->vm_map)) { vmspace_free(vm); PROC_UNLOCK(p); goto nextproc; diff --git a/sys/vm/vm_map.c b/sys/vm/vm_map.c index 73cf6b0..9b91c1a 100644 --- a/sys/vm/vm_map.c +++ b/sys/vm/vm_map.c @@ -336,6 +336,7 @@ vmspace_swap_count(struct vmspace *vmspace) vm_map_entry_t cur; int count = 0; + vm_map_lock_read(map); for (cur = map->header.next; cur != &map->header; cur = cur->next) { vm_object_t object; @@ -351,6 +352,7 @@ vmspace_swap_count(struct vmspace *vmspace) } } } + vm_map_unlock_read(map); return (count); } @@ -397,6 +399,14 @@ vm_map_unlock_read(vm_map_t map) lockmgr(&(map)->lock, LK_RELEASE, NULL, curthread); } +int +vm_map_trylock(vm_map_t map) +{ + + return (lockmgr(&map->lock, LK_EXCLUSIVE | LK_NOWAIT, NULL, + curthread) == 0); +} + static __inline__ int _vm_map_lock_upgrade(vm_map_t map, struct thread *td) { int error; diff --git a/sys/vm/vm_map.h b/sys/vm/vm_map.h index fbc44c9..8de264f 100644 --- a/sys/vm/vm_map.h +++ b/sys/vm/vm_map.h @@ -241,6 +241,7 @@ void vm_map_lock(vm_map_t map); void vm_map_unlock(vm_map_t map); void vm_map_lock_read(vm_map_t map); void vm_map_unlock_read(vm_map_t map); +int vm_map_trylock(vm_map_t map); int vm_map_lock_upgrade(vm_map_t map); void vm_map_lock_downgrade(vm_map_t map); void vm_map_set_recursive(vm_map_t map); diff --git a/sys/vm/vm_pageout.c b/sys/vm/vm_pageout.c index 23e94f2..5708d8d 100644 --- a/sys/vm/vm_pageout.c +++ b/sys/vm/vm_pageout.c @@ -547,9 +547,8 @@ vm_pageout_map_deactivate_pages(map, desired) int nothingwired; GIANT_REQUIRED; - if (lockmgr(&map->lock, LK_EXCLUSIVE | LK_NOWAIT, (void *)0, curthread)) { + if (!vm_map_trylock(map)) return; - } bigobj = NULL; nothingwired = TRUE; |