summaryrefslogtreecommitdiffstats
path: root/sys/vm/vnode_pager.c
diff options
context:
space:
mode:
authorpeter <peter@FreeBSD.org>2000-05-21 12:50:18 +0000
committerpeter <peter@FreeBSD.org>2000-05-21 12:50:18 +0000
commitee5cd6988fd6860707babbcfbe036049d375cafd (patch)
tree2df035f35d0064994e9cd134cd613f8e79cdb23f /sys/vm/vnode_pager.c
parent65f441c07383ce9e6f10124810cff27e1cb0f737 (diff)
downloadFreeBSD-src-ee5cd6988fd6860707babbcfbe036049d375cafd.zip
FreeBSD-src-ee5cd6988fd6860707babbcfbe036049d375cafd.tar.gz
Implement an optimization of the VM<->pmap API. Pass vm_page_t's directly
to various pmap_*() functions instead of looking up the physical address and passing that. In many cases, the first thing the pmap code was doing was going to a lot of trouble to get back the original vm_page_t, or it's shadow pv_table entry. Inspired by: John Dyson's 1998 patches. Also: Eliminate pv_table as a seperate thing and build it into a machine dependent part of vm_page_t. This eliminates having a seperate set of structions that shadow each other in a 1:1 fashion that we often went to a lot of trouble to translate from one to the other. (see above) This happens to save 4 bytes of physical memory for each page in the system. (8 bytes on the Alpha). Eliminate the use of the phys_avail[] array to determine if a page is managed (ie: it has pv_entries etc). Store this information in a flag. Things like device_pager set it because they create vm_page_t's on the fly that do not have pv_entries. This makes it easier to "unmanage" a page of physical memory (this will be taken advantage of in subsequent commits). Add a function to add a new page to the freelist. This could be used for reclaiming the previously wasted pages left over from preloaded loader(8) files. Reviewed by: dillon
Diffstat (limited to 'sys/vm/vnode_pager.c')
-rw-r--r--sys/vm/vnode_pager.c6
1 files changed, 3 insertions, 3 deletions
diff --git a/sys/vm/vnode_pager.c b/sys/vm/vnode_pager.c
index 904ffd2..2633426 100644
--- a/sys/vm/vnode_pager.c
+++ b/sys/vm/vnode_pager.c
@@ -452,7 +452,7 @@ vnode_pager_input_smlfs(object, m)
}
}
vm_pager_unmap_page(kva);
- pmap_clear_modify(VM_PAGE_TO_PHYS(m));
+ pmap_clear_modify(m);
vm_page_flag_clear(m, PG_ZERO);
if (error) {
return VM_PAGER_ERROR;
@@ -515,7 +515,7 @@ vnode_pager_input_old(object, m)
}
vm_pager_unmap_page(kva);
}
- pmap_clear_modify(VM_PAGE_TO_PHYS(m));
+ pmap_clear_modify(m);
vm_page_undirty(m);
vm_page_flag_clear(m, PG_ZERO);
if (!error)
@@ -782,7 +782,7 @@ vnode_pager_generic_getpages(vp, m, bytecount, reqpage)
*/
mt->valid = VM_PAGE_BITS_ALL;
vm_page_undirty(mt); /* should be an assert? XXX */
- pmap_clear_modify(VM_PAGE_TO_PHYS(mt));
+ pmap_clear_modify(mt);
} else {
/*
* Read did not fill up entire page. Since this
OpenPOWER on IntegriCloud