aboutsummaryrefslogtreecommitdiff
path: root/sys/vm/vm_object.c
diff options
context:
space:
mode:
authorAlan Cox <alc@FreeBSD.org>2010-05-07 05:23:15 +0000
committerAlan Cox <alc@FreeBSD.org>2010-05-07 05:23:15 +0000
commit7072188017d1e4bbb4de8cc5684548eb82c7e08a (patch)
tree89ce22ca005f48ab502b68edb9db98d02859e2f1 /sys/vm/vm_object.c
parent9402dff3de6195cb2060113b695e49f850b4102f (diff)
downloadsrc-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/vm/vm_object.c')
-rw-r--r--sys/vm/vm_object.c11
1 files changed, 2 insertions, 9 deletions
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;