diff options
author | Alfred Perlstein <alfred@FreeBSD.org> | 2001-05-19 01:28:09 +0000 |
---|---|---|
committer | Alfred Perlstein <alfred@FreeBSD.org> | 2001-05-19 01:28:09 +0000 |
commit | 2395531439bb140427dff4dfd6d67856f907c15e (patch) | |
tree | 7d51c8cab74aeec829658414e052238902ea14a0 /sys/vm/vm_meter.c | |
parent | 3620eb66f3ef16ff28810c74476f01e29c1562bf (diff) | |
download | src-2395531439bb140427dff4dfd6d67856f907c15e.tar.gz src-2395531439bb140427dff4dfd6d67856f907c15e.zip |
Introduce a global lock for the vm subsystem (vm_mtx).
vm_mtx does not recurse and is required for most low level
vm operations.
faults can not be taken without holding Giant.
Memory subsystems can now call the base page allocators safely.
Almost all atomic ops were removed as they are covered under the
vm mutex.
Alpha and ia64 now need to catch up to i386's trap handlers.
FFS and NFS have been tested, other filesystems will need minor
changes (grabbing the vm lock when twiddling page properties).
Reviewed (partially) by: jake, jhb
Notes
Notes:
svn path=/head/; revision=76827
Diffstat (limited to 'sys/vm/vm_meter.c')
-rw-r--r-- | sys/vm/vm_meter.c | 6 |
1 files changed, 6 insertions, 0 deletions
diff --git a/sys/vm/vm_meter.c b/sys/vm/vm_meter.c index 8dcb9067bbb8..0f4e1072368f 100644 --- a/sys/vm/vm_meter.c +++ b/sys/vm/vm_meter.c @@ -145,8 +145,10 @@ vmtotal(SYSCTL_HANDLER_ARGS) /* * Mark all objects as inactive. */ + mtx_lock(&vm_mtx); TAILQ_FOREACH(object, &vm_object_list, object_list) vm_object_clear_flag(object, OBJ_ACTIVE); + mtx_unlock(&vm_mtx); /* * Calculate process statistics. */ @@ -197,6 +199,7 @@ vmtotal(SYSCTL_HANDLER_ARGS) * Note active objects. */ paging = 0; + mtx_lock(&vm_mtx); for (map = &p->p_vmspace->vm_map, entry = map->header.next; entry != &map->header; entry = entry->next) { if ((entry->eflags & MAP_ENTRY_IS_SUB_MAP) || @@ -205,6 +208,7 @@ vmtotal(SYSCTL_HANDLER_ARGS) vm_object_set_flag(entry->object.vm_object, OBJ_ACTIVE); paging |= entry->object.vm_object->paging_in_progress; } + mtx_unlock(&vm_mtx); if (paging) totalp->t_pw++; } @@ -212,6 +216,7 @@ vmtotal(SYSCTL_HANDLER_ARGS) /* * Calculate object memory usage statistics. */ + mtx_lock(&vm_mtx); TAILQ_FOREACH(object, &vm_object_list, object_list) { /* * devices, like /dev/mem, will badly skew our totals @@ -235,6 +240,7 @@ vmtotal(SYSCTL_HANDLER_ARGS) } } totalp->t_free = cnt.v_free_count + cnt.v_cache_count; + mtx_unlock(&vm_mtx); return (sysctl_handle_opaque(oidp, totalp, sizeof total, req)); } |