Skip site navigation (1)Skip section navigation (2)
Date:      Sat, 4 Feb 2012 17:43:16 +0000 (UTC)
From:      Attilio Rao <attilio@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-user@freebsd.org
Subject:   svn commit: r230988 - user/attilio/vmcontention/sys/fs/tmpfs
Message-ID:  <201202041743.q14HhGkB045324@svn.freebsd.org>

next in thread | raw e-mail | index | archive | help
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;



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201202041743.q14HhGkB045324>