svn commit: r221714 - head/sys/vm

Max Laier mlaier at FreeBSD.org
Mon May 9 20:27:49 UTC 2011


Author: mlaier
Date: Mon May  9 20:27:49 2011
New Revision: 221714
URL: http://svn.freebsd.org/changeset/base/221714

Log:
  Another long standing vm bug found at Isilon:
   Fix a race between vm_object_collapse and vm_fault.
  
  Reviewed by:	alc@
  MFC after:	3 days

Modified:
  head/sys/vm/vm_object.c

Modified: head/sys/vm/vm_object.c
==============================================================================
--- head/sys/vm/vm_object.c	Mon May  9 20:20:43 2011	(r221713)
+++ head/sys/vm/vm_object.c	Mon May  9 20:27:49 2011	(r221714)
@@ -1468,6 +1468,24 @@ vm_object_backing_scan(vm_object_t objec
 
 			pp = vm_page_lookup(object, new_pindex);
 			if (
+			    (op & OBSC_COLLAPSE_NOWAIT) != 0 &&
+			    (pp != NULL && pp->valid == 0)
+			) {
+				/*
+				 * The page in the parent is not (yet) valid.
+				 * We don't know anything about the state of
+				 * the original page.  It might be mapped,
+				 * so we must avoid the next if here.
+				 *
+				 * This is due to a race in vm_fault() where
+				 * we must unbusy the original (backing_obj)
+				 * page before we can (re)lock the parent.
+				 * Hence we can get here.
+				 */
+				p = next;
+				continue;
+			}
+			if (
 			    pp != NULL ||
 			    vm_pager_has_page(object, new_pindex, NULL, NULL)
 			) {


More information about the svn-src-head mailing list