diff options
author | Alan Cox <alc@FreeBSD.org> | 2010-05-07 05:23:15 +0000 |
---|---|---|
committer | Alan Cox <alc@FreeBSD.org> | 2010-05-07 05:23:15 +0000 |
commit | 7072188017d1e4bbb4de8cc5684548eb82c7e08a (patch) | |
tree | 89ce22ca005f48ab502b68edb9db98d02859e2f1 /sys | |
parent | 9402dff3de6195cb2060113b695e49f850b4102f (diff) | |
download | src-7072188017d1e4bbb4de8cc5684548eb82c7e08a.tar.gz src-7072188017d1e4bbb4de8cc5684548eb82c7e08a.zip |
Eliminate acquisitions of the page queues lock that are no longer needed.
Switch to a per-processor counter for the number of pages freed during
process termination.
Notes
Notes:
svn path=/head/; revision=207739
Diffstat (limited to 'sys')
-rw-r--r-- | sys/sys/vmmeter.h | 2 | ||||
-rw-r--r-- | sys/vm/vm_object.c | 11 |
2 files changed, 3 insertions, 10 deletions
diff --git a/sys/sys/vmmeter.h b/sys/sys/vmmeter.h index 6c866c7f1dcf..9f5756d987b1 100644 --- a/sys/sys/vmmeter.h +++ b/sys/sys/vmmeter.h @@ -74,7 +74,7 @@ struct vmmeter { u_int v_tcached; /* (q) total pages cached */ u_int v_dfree; /* (q) pages freed by daemon */ - u_int v_pfree; /* (q) pages freed by exiting processes */ + u_int v_pfree; /* (p) pages freed by exiting processes */ u_int v_tfree; /* (p) total pages freed */ /* * Distribution of page usages. diff --git a/sys/vm/vm_object.c b/sys/vm/vm_object.c index 3986d142d87b..5428c98f5449 100644 --- a/sys/vm/vm_object.c +++ b/sys/vm/vm_object.c @@ -722,14 +722,11 @@ vm_object_terminate(vm_object_t object) ("vm_object_terminate: freeing busy page %p " "p->busy = %d, p->oflags %x\n", p, p->busy, p->oflags)); vm_page_lock(p); - vm_page_lock_queues(); if (p->wire_count == 0) { vm_page_free(p); - cnt.v_pfree++; - } else { + PCPU_INC(cnt.v_pfree); + } else vm_page_remove(p); - } - vm_page_unlock_queues(); vm_page_unlock(p); } @@ -1634,14 +1631,12 @@ vm_object_backing_scan(vm_object_t object, int op) * can simply destroy it. */ vm_page_lock(p); - vm_page_lock_queues(); KASSERT(!pmap_page_is_mapped(p), ("freeing mapped page %p", p)); if (p->wire_count == 0) vm_page_free(p); else vm_page_remove(p); - vm_page_unlock_queues(); vm_page_unlock(p); p = next; continue; @@ -1660,14 +1655,12 @@ vm_object_backing_scan(vm_object_t object, int op) * Leave the parent's page alone */ vm_page_lock(p); - vm_page_lock_queues(); KASSERT(!pmap_page_is_mapped(p), ("freeing mapped page %p", p)); if (p->wire_count == 0) vm_page_free(p); else vm_page_remove(p); - vm_page_unlock_queues(); vm_page_unlock(p); p = next; continue; |