svn commit: r209792 - head/sys/vm

Konstantin Belousov kib at FreeBSD.org
Thu Jul 8 08:37:51 UTC 2010


Author: kib
Date: Thu Jul  8 08:37:51 2010
New Revision: 209792
URL: http://svn.freebsd.org/changeset/base/209792

Log:
  Make VM_ALLOC_RETRY flag mandatory for vm_page_grab(). Assert that the
  flag is always provided, and unconditionally retry after sleep for the
  busy page or failed allocation.
  
  The intent is to remove VM_ALLOC_RETRY eventually.
  
  Proposed and reviewed by:	alc

Modified:
  head/sys/vm/vm_page.c
  head/sys/vm/vm_page.h

Modified: head/sys/vm/vm_page.c
==============================================================================
--- head/sys/vm/vm_page.c	Thu Jul  8 04:04:27 2010	(r209791)
+++ head/sys/vm/vm_page.c	Thu Jul  8 08:37:51 2010	(r209792)
@@ -2032,6 +2032,9 @@ vm_page_dontneed(vm_page_t m)
  * to be in the object.  If the page doesn't exist, first allocate it
  * and then conditionally zero it.
  *
+ * The caller must always specify the VM_ALLOC_RETRY flag.  This is intended
+ * to facilitate its eventual removal.
+ *
  * This routine may block.
  */
 vm_page_t
@@ -2041,22 +2044,20 @@ vm_page_grab(vm_object_t object, vm_pind
 	u_int count;
 
 	VM_OBJECT_LOCK_ASSERT(object, MA_OWNED);
+	KASSERT((allocflags & VM_ALLOC_RETRY) != 0,
+	    ("vm_page_grab: VM_ALLOC_RETRY is required"));
 retrylookup:
 	if ((m = vm_page_lookup(object, pindex)) != NULL) {
 		if ((m->oflags & VPO_BUSY) != 0 ||
 		    ((allocflags & VM_ALLOC_IGN_SBUSY) == 0 && m->busy != 0)) {
-			if ((allocflags & VM_ALLOC_RETRY) != 0) {
-				/*
-				 * Reference the page before unlocking and
-				 * sleeping so that the page daemon is less
-				 * likely to reclaim it. 
-				 */
-				vm_page_lock_queues();
-				vm_page_flag_set(m, PG_REFERENCED);
-			}
+			/*
+			 * Reference the page before unlocking and
+			 * sleeping so that the page daemon is less
+			 * likely to reclaim it.
+			 */
+			vm_page_lock_queues();
+			vm_page_flag_set(m, PG_REFERENCED);
 			vm_page_sleep(m, "pgrbwt");
-			if ((allocflags & VM_ALLOC_RETRY) == 0)
-				return (NULL);
 			goto retrylookup;
 		} else {
 			if ((allocflags & VM_ALLOC_WIRED) != 0) {
@@ -2078,8 +2079,6 @@ retrylookup:
 			atomic_add_int(&vm_pageout_deficit, count);
 		VM_WAIT;
 		VM_OBJECT_LOCK(object);
-		if ((allocflags & VM_ALLOC_RETRY) == 0)
-			return (NULL);
 		goto retrylookup;
 	} else if (m->valid != 0)
 		return (m);

Modified: head/sys/vm/vm_page.h
==============================================================================
--- head/sys/vm/vm_page.h	Thu Jul  8 04:04:27 2010	(r209791)
+++ head/sys/vm/vm_page.h	Thu Jul  8 08:37:51 2010	(r209792)
@@ -312,7 +312,7 @@ extern struct vpglocks vm_page_queue_loc
 /* page allocation flags: */
 #define	VM_ALLOC_WIRED		0x0020	/* non pageable */
 #define	VM_ALLOC_ZERO		0x0040	/* Try to obtain a zeroed page */
-#define	VM_ALLOC_RETRY		0x0080	/* vm_page_grab() only */
+#define	VM_ALLOC_RETRY		0x0080	/* Mandatory with vm_page_grab() */
 #define	VM_ALLOC_NOOBJ		0x0100	/* No associated object */
 #define	VM_ALLOC_NOBUSY		0x0200	/* Do not busy the page */
 #define	VM_ALLOC_IFCACHED	0x0400	/* Fail if the page is not cached */


More information about the svn-src-head mailing list