svn commit: r227072 - head/sys/vm

Alan Cox alc at FreeBSD.org
Fri Nov 4 04:41:59 UTC 2011


Author: alc
Date: Fri Nov  4 04:41:58 2011
New Revision: 227072
URL: http://svn.freebsd.org/changeset/base/227072

Log:
  Simplify the implementation of the failure case in kmem_alloc_attr().

Modified:
  head/sys/vm/vm_contig.c

Modified: head/sys/vm/vm_contig.c
==============================================================================
--- head/sys/vm/vm_contig.c	Fri Nov  4 04:06:31 2011	(r227071)
+++ head/sys/vm/vm_contig.c	Fri Nov  4 04:41:58 2011	(r227072)
@@ -258,8 +258,8 @@ kmem_alloc_attr(vm_map_t map, vm_size_t 
 retry:
 		m = vm_phys_alloc_contig(1, low, high, PAGE_SIZE, 0);
 		if (m == NULL) {
+			VM_OBJECT_UNLOCK(object);
 			if (tries < ((flags & M_NOWAIT) != 0 ? 1 : 3)) {
-				VM_OBJECT_UNLOCK(object);
 				vm_map_unlock(map);
 				vm_contig_grow_cache(tries, low, high);
 				vm_map_lock(map);
@@ -267,13 +267,12 @@ retry:
 				tries++;
 				goto retry;
 			}
-			while (i != 0) {
-				i -= PAGE_SIZE;
-				m = vm_page_lookup(object, OFF_TO_IDX(offset +
-				    i));
-				vm_page_free(m);
-			}
-			VM_OBJECT_UNLOCK(object);
+			/*
+			 * Since the pages that were allocated by any previous
+			 * iterations of this loop are not busy, they can be
+			 * freed by vm_object_page_remove(), which is called
+			 * by vm_map_delete().
+			 */
 			vm_map_delete(map, addr, addr + size);
 			vm_map_unlock(map);
 			return (0);


More information about the svn-src-all mailing list