svn commit: r230987 -
user/attilio/vmcontention/sys/cddl/contrib/opensolaris/uts/common/fs/zfs
Attilio Rao
attilio at FreeBSD.org
Sat Feb 4 17:34:10 UTC 2012
Author: attilio
Date: Sat Feb 4 17:34:09 2012
New Revision: 230987
URL: http://svn.freebsd.org/changeset/base/230987
Log:
Make a more comprehensive fix for vm_page_lookup which takes into account
cached pages.
Modified:
user/attilio/vmcontention/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/zfs_vnops.c
Modified: user/attilio/vmcontention/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/zfs_vnops.c
==============================================================================
--- user/attilio/vmcontention/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/zfs_vnops.c Sat Feb 4 17:18:16 2012 (r230986)
+++ user/attilio/vmcontention/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/zfs_vnops.c Sat Feb 4 17:34:09 2012 (r230987)
@@ -321,22 +321,32 @@ page_lookup(vnode_t *vp, int64_t start,
obj = vp->v_object;
VM_OBJECT_LOCK_ASSERT(obj, MA_OWNED);
+ mtx_assert(&vm_page_queue_free_mtx, MA_NOTOWNED);
for (;;) {
- if ((pp = vm_page_lookup(obj, OFF_TO_IDX(start))) != NULL &&
- vm_page_is_valid(pp, (vm_offset_t)off, nbytes)) {
- if ((pp->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(pp);
- vm_page_sleep(pp, "zfsmwb");
- continue;
+ if ((pp = vm_radix_lookup(&obj->rtree, OFF_TO_IDX(start),
+ VM_RADIX_ANY)) != NULL) {
+ if (pp->flags & PG_CACHED) {
+ mtx_lock(&vm_page_queue_free_mtx);
+ if (pp->object == obj)
+ vm_page_cache_remove(pp);
+ mtx_unlock(&vm_page_queue_free_mtx);
+ pp = NULL;
+ } else if (vm_page_is_valid(pp, (vm_offset_t)off,
+ nbytes)) {
+ if ((pp->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(pp);
+ vm_page_sleep(pp, "zfsmwb");
+ continue;
+ }
+ vm_page_busy(pp);
+ vm_page_undirty(pp);
}
- vm_page_busy(pp);
- vm_page_undirty(pp);
} else
pp = NULL;
break;
More information about the svn-src-user
mailing list