diff options
author | alc <alc@FreeBSD.org> | 2002-04-20 07:23:22 +0000 |
---|---|---|
committer | alc <alc@FreeBSD.org> | 2002-04-20 07:23:22 +0000 |
commit | 80bca30405c2a08b4b1b4e7f4a6d13771870dc98 (patch) | |
tree | ecd9967c03b704767150a51c3172dbb0ece35798 | |
parent | 4c135df5a2fa28715ba1c65b9499d9ab8d2f808d (diff) | |
download | FreeBSD-src-80bca30405c2a08b4b1b4e7f4a6d13771870dc98.zip FreeBSD-src-80bca30405c2a08b4b1b4e7f4a6d13771870dc98.tar.gz |
Reintroduce locking on accesses to vm_object_list.
-rw-r--r-- | sys/vm/vm_meter.c | 4 | ||||
-rw-r--r-- | sys/vm/vm_object.c | 6 | ||||
-rw-r--r-- | sys/vm/vm_object.h | 1 |
3 files changed, 10 insertions, 1 deletions
diff --git a/sys/vm/vm_meter.c b/sys/vm/vm_meter.c index fde1f49..935979ae 100644 --- a/sys/vm/vm_meter.c +++ b/sys/vm/vm_meter.c @@ -95,8 +95,10 @@ vmtotal(SYSCTL_HANDLER_ARGS) * Mark all objects as inactive. */ GIANT_REQUIRED; + mtx_lock(&vm_object_list_mtx); TAILQ_FOREACH(object, &vm_object_list, object_list) vm_object_clear_flag(object, OBJ_ACTIVE); + mtx_unlock(&vm_object_list_mtx); /* * Calculate process statistics. */ @@ -164,6 +166,7 @@ vmtotal(SYSCTL_HANDLER_ARGS) /* * Calculate object memory usage statistics. */ + mtx_lock(&vm_object_list_mtx); TAILQ_FOREACH(object, &vm_object_list, object_list) { /* * devices, like /dev/mem, will badly skew our totals @@ -186,6 +189,7 @@ vmtotal(SYSCTL_HANDLER_ARGS) } } } + mtx_unlock(&vm_object_list_mtx); totalp->t_free = cnt.v_free_count + cnt.v_cache_count; return (sysctl_handle_opaque(oidp, totalp, sizeof total, req)); } diff --git a/sys/vm/vm_object.c b/sys/vm/vm_object.c index 37c329d..5d13cac 100644 --- a/sys/vm/vm_object.c +++ b/sys/vm/vm_object.c @@ -137,7 +137,7 @@ static int vm_object_page_collect_flush(vm_object_t object, vm_page_t p, int cur */ struct object_q vm_object_list; -static struct mtx vm_object_list_mtx; /* lock for object list and count */ +struct mtx vm_object_list_mtx; /* lock for object list and count */ vm_object_t kernel_object; vm_object_t kmem_object; static struct vm_object kernel_object_store; @@ -222,7 +222,9 @@ _vm_object_allocate(objtype_t type, vm_size_t size, vm_object_t object) object->generation++; + mtx_lock(&vm_object_list_mtx); TAILQ_INSERT_TAIL(&vm_object_list, object, object_list); + mtx_unlock(&vm_object_list_mtx); object_hash_rand = object->hash_rand; } @@ -1511,11 +1513,13 @@ vm_object_collapse(vm_object_t object) KASSERT(backing_object->ref_count == 1, ("backing_object %p was somehow re-referenced during collapse!", backing_object)); KASSERT(TAILQ_FIRST(&backing_object->memq) == NULL, ("backing_object %p somehow has left over pages during collapse!", backing_object)); + mtx_lock(&vm_object_list_mtx); TAILQ_REMOVE( &vm_object_list, backing_object, object_list ); + mtx_unlock(&vm_object_list_mtx); uma_zfree(obj_zone, backing_object); diff --git a/sys/vm/vm_object.h b/sys/vm/vm_object.h index 1256e85..62244a9 100644 --- a/sys/vm/vm_object.h +++ b/sys/vm/vm_object.h @@ -160,6 +160,7 @@ struct vm_object { TAILQ_HEAD(object_q, vm_object); extern struct object_q vm_object_list; /* list of allocated objects */ +extern struct mtx vm_object_list_mtx; /* lock for object list and count */ extern vm_object_t kernel_object; /* the single kernel object */ extern vm_object_t kmem_object; |