Skip site navigation (1)Skip section navigation (2)
Date:      Wed, 29 Feb 2012 05:41:30 +0000 (UTC)
From:      Alan Cox <alc@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org
Subject:   svn commit: r232288 - head/sys/vm
Message-ID:  <201202290541.q1T5fU7r010961@svn.freebsd.org>

next in thread | raw e-mail | index | archive | help
Author: alc
Date: Wed Feb 29 05:41:29 2012
New Revision: 232288
URL: http://svn.freebsd.org/changeset/base/232288

Log:
  Simplify kmem_alloc() by eliminating code that existed on account of
  external pagers in Mach.  FreeBSD doesn't implement external pagers.
  Moreover, it don't pageout the kernel object.  So, the reasons for
  having code don't hold.
  
  Reviewed by:	kib
  MFC after:	6 weeks

Modified:
  head/sys/vm/vm_kern.c

Modified: head/sys/vm/vm_kern.c
==============================================================================
--- head/sys/vm/vm_kern.c	Wed Feb 29 02:04:41 2012	(r232287)
+++ head/sys/vm/vm_kern.c	Wed Feb 29 05:41:29 2012	(r232288)
@@ -161,7 +161,6 @@ kmem_alloc(map, size)
 {
 	vm_offset_t addr;
 	vm_offset_t offset;
-	vm_offset_t i;
 
 	size = round_page(size);
 
@@ -187,35 +186,6 @@ kmem_alloc(map, size)
 	vm_map_unlock(map);
 
 	/*
-	 * Guarantee that there are pages already in this object before
-	 * calling vm_map_wire.  This is to prevent the following
-	 * scenario:
-	 *
-	 * 1) Threads have swapped out, so that there is a pager for the
-	 * kernel_object. 2) The kmsg zone is empty, and so we are
-	 * kmem_allocing a new page for it. 3) vm_map_wire calls vm_fault;
-	 * there is no page, but there is a pager, so we call
-	 * pager_data_request.  But the kmsg zone is empty, so we must
-	 * kmem_alloc. 4) goto 1 5) Even if the kmsg zone is not empty: when
-	 * we get the data back from the pager, it will be (very stale)
-	 * non-zero data.  kmem_alloc is defined to return zero-filled memory.
-	 *
-	 * We're intentionally not activating the pages we allocate to prevent a
-	 * race with page-out.  vm_map_wire will wire the pages.
-	 */
-	VM_OBJECT_LOCK(kernel_object);
-	for (i = 0; i < size; i += PAGE_SIZE) {
-		vm_page_t mem;
-
-		mem = vm_page_grab(kernel_object, OFF_TO_IDX(offset + i),
-		    VM_ALLOC_NOBUSY | VM_ALLOC_ZERO | VM_ALLOC_RETRY);
-		mem->valid = VM_PAGE_BITS_ALL;
-		KASSERT((mem->oflags & VPO_UNMANAGED) != 0,
-		    ("kmem_alloc: page %p is managed", mem));
-	}
-	VM_OBJECT_UNLOCK(kernel_object);
-
-	/*
 	 * And finally, mark the data as non-pageable.
 	 */
 	(void) vm_map_wire(map, addr, addr + size,



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