svn commit: r230988 - user/attilio/vmcontention/sys/fs/tmpfs
Attilio Rao
attilio at FreeBSD.org
Sat Feb 4 17:43:16 UTC 2012
Author: attilio
Date: Sat Feb 4 17:43:15 2012
New Revision: 230988
URL: http://svn.freebsd.org/changeset/base/230988
Log:
Fix tmpfs in order to take into account also cached pages.
Modified:
user/attilio/vmcontention/sys/fs/tmpfs/tmpfs_vnops.c
Modified: user/attilio/vmcontention/sys/fs/tmpfs/tmpfs_vnops.c
==============================================================================
--- user/attilio/vmcontention/sys/fs/tmpfs/tmpfs_vnops.c Sat Feb 4 17:34:09 2012 (r230987)
+++ user/attilio/vmcontention/sys/fs/tmpfs/tmpfs_vnops.c Sat Feb 4 17:43:15 2012 (r230988)
@@ -648,21 +648,30 @@ tmpfs_mappedwrite(vm_object_t vobj, vm_o
goto nocache;
}
lookupvpg:
- if (((vpg = vm_page_lookup(vobj, idx)) != NULL) &&
- vm_page_is_valid(vpg, offset, tlen)) {
- if ((vpg->oflags & VPO_BUSY) != 0) {
- /*
- * Reference the page before unlocking and sleeping so
- * that the page daemon is less likely to reclaim it.
- */
- vm_page_reference(vpg);
- vm_page_sleep(vpg, "tmfsmw");
- goto lookupvpg;
+ if ((vpg = vm_radix_lookup(&vobj->rtree, idx, VM_RADIX_ANY)) != NULL) {
+ if (vpg->flags & PG_CACHED) {
+ mtx_lock(&vm_page_queue_free_mtx);
+ if (vpg->object == vobj)
+ vm_page_cache_remove(vpg);
+ mtx_unlock(&vm_page_queue_free_mtx);
+ VM_OBJECT_UNLOCK(vobj);
+ vpg = NULL;
+ } else if (vm_page_is_valid(vpg, offset, tlen)) {
+ if ((vpg->oflags & VPO_BUSY) != 0) {
+ /*
+ * Reference the page before unlocking and
+ * sleeping so that the page daemon is less
+ * likely to reclaim it.
+ */
+ vm_page_reference(vpg);
+ vm_page_sleep(vpg, "tmfsmw");
+ goto lookupvpg;
+ }
+ vm_page_busy(vpg);
+ vm_page_undirty(vpg);
+ VM_OBJECT_UNLOCK(vobj);
+ error = uiomove_fromphys(&vpg, offset, tlen, uio);
}
- vm_page_busy(vpg);
- vm_page_undirty(vpg);
- VM_OBJECT_UNLOCK(vobj);
- error = uiomove_fromphys(&vpg, offset, tlen, uio);
} else {
VM_OBJECT_UNLOCK(vobj);
vpg = NULL;
More information about the svn-src-user
mailing list