svn commit: r246603 - head/sys/fs/tmpfs

Attilio Rao attilio at FreeBSD.org
Sun Feb 10 01:04:12 UTC 2013


Author: attilio
Date: Sun Feb 10 01:04:10 2013
New Revision: 246603
URL: http://svnweb.freebsd.org/changeset/base/246603

Log:
  Remove a racy checks on resident and cached pages for
  tmpfs_mapped{read, write}() functions:
  - tmpfs_mapped{read, write}() are only called within VOP_{READ, WRITE}(),
    which check before-hand to work only on valid VREG vnodes.  Also the
    vnode is locked for the duration of the work, making vnode reclaiming
    impossible, during the operation. Hence, vobj can never be NULL.
  - Currently check on resident pages and cached pages without vm object
    lock held is racy and can do even more harm than good, as a page could
    be transitioning between these 2 pools and then be skipped entirely.
    Skip the checks as lookups on empty splay trees are very cheap.
  
  Discussed with:	alc
  Tested by:	flo
  MFC after:	2 weeks

Modified:
  head/sys/fs/tmpfs/tmpfs_vnops.c

Modified: head/sys/fs/tmpfs/tmpfs_vnops.c
==============================================================================
--- head/sys/fs/tmpfs/tmpfs_vnops.c	Sat Feb  9 23:17:28 2013	(r246602)
+++ head/sys/fs/tmpfs/tmpfs_vnops.c	Sun Feb 10 01:04:10 2013	(r246603)
@@ -511,10 +511,6 @@ tmpfs_mappedread(vm_object_t vobj, vm_ob
 	offset = addr & PAGE_MASK;
 	tlen = MIN(PAGE_SIZE - offset, len);
 
-	if ((vobj == NULL) ||
-	    (vobj->resident_page_count == 0 && vobj->cache == NULL))
-		goto nocache;
-
 	VM_OBJECT_LOCK(vobj);
 lookupvpg:
 	if (((m = vm_page_lookup(vobj, idx)) != NULL) &&
@@ -569,7 +565,6 @@ lookupvpg:
 		return	(error);
 	}
 	VM_OBJECT_UNLOCK(vobj);
-nocache:
 	error = tmpfs_nocacheread(tobj, idx, offset, tlen, uio);
 
 	return	(error);
@@ -639,12 +634,6 @@ tmpfs_mappedwrite(vm_object_t vobj, vm_o
 	offset = addr & PAGE_MASK;
 	tlen = MIN(PAGE_SIZE - offset, len);
 
-	if ((vobj == NULL) ||
-	    (vobj->resident_page_count == 0 && vobj->cache == NULL)) {
-		vpg = NULL;
-		goto nocache;
-	}
-
 	VM_OBJECT_LOCK(vobj);
 lookupvpg:
 	if (((vpg = vm_page_lookup(vobj, idx)) != NULL) &&
@@ -668,7 +657,6 @@ lookupvpg:
 		VM_OBJECT_UNLOCK(vobj);
 		vpg = NULL;
 	}
-nocache:
 	VM_OBJECT_LOCK(tobj);
 	tpg = vm_page_grab(tobj, idx, VM_ALLOC_WIRED |
 	    VM_ALLOC_NORMAL | VM_ALLOC_RETRY);


More information about the svn-src-all mailing list