svn commit: r260137 - head/sys/vm

Alan Cox alc at FreeBSD.org
Tue Dec 31 18:25:16 UTC 2013


Author: alc
Date: Tue Dec 31 18:25:15 2013
New Revision: 260137
URL: http://svnweb.freebsd.org/changeset/base/260137

Log:
  Since the introduction of the popmap to reservations in r259999, there is
  no longer any need for the page's PG_CACHED and PG_FREE flags to be set and
  cleared while the free page queues lock is held.  Thus, vm_page_alloc(),
  vm_page_alloc_contig(), and vm_page_alloc_freelist() can wait until after
  the free page queues lock is released to clear the page's flags.  Moreover,
  the PG_FREE flag can be retired.  Now that the reservation system no longer
  uses it, its only uses are in a few assertions.  Eliminating these
  assertions is no real loss.  Other assertions catch the same types of
  misbehavior, like doubly freeing a page (see r260032) or dirtying a free
  page (free pages are invalid and only valid pages can be dirtied).
  
  Eliminate an unneeded variable from vm_page_alloc_contig().
  
  Sponsored by:	EMC / Isilon Storage Division

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

Modified: head/sys/vm/vm_page.c
==============================================================================
--- head/sys/vm/vm_page.c	Tue Dec 31 17:29:29 2013	(r260136)
+++ head/sys/vm/vm_page.c	Tue Dec 31 18:25:15 2013	(r260137)
@@ -922,8 +922,6 @@ vm_page_dirty_KBI(vm_page_t m)
 	/* These assertions refer to this operation by its public name. */
 	KASSERT((m->flags & PG_CACHED) == 0,
 	    ("vm_page_dirty: page in cache!"));
-	KASSERT(!VM_PAGE_IS_FREE(m),
-	    ("vm_page_dirty: page is free!"));
 	KASSERT(m->valid == VM_PAGE_BITS_ALL,
 	    ("vm_page_dirty: page is invalid!"));
 	m->dirty = VM_PAGE_BITS_ALL;
@@ -1568,27 +1566,24 @@ vm_page_alloc(vm_object_t object, vm_pin
 		    vm_object_cache_is_empty(m_object))
 			vp = m_object->handle;
 	} else {
-		KASSERT(VM_PAGE_IS_FREE(m),
-		    ("vm_page_alloc: page %p is not free", m));
 		KASSERT(m->valid == 0,
 		    ("vm_page_alloc: free page %p is valid", m));
 		vm_phys_freecnt_adj(m, -1);
+		if ((m->flags & PG_ZERO) != 0)
+			vm_page_zero_count--;
 	}
+	mtx_unlock(&vm_page_queue_free_mtx);
 
 	/*
-	 * Only the PG_ZERO flag is inherited.  The PG_CACHED or PG_FREE flag
-	 * must be cleared before the free page queues lock is released.
+	 * Initialize the page.  Only the PG_ZERO flag is inherited.
 	 */
 	flags = 0;
-	if (m->flags & PG_ZERO) {
-		vm_page_zero_count--;
-		if (req & VM_ALLOC_ZERO)
-			flags = PG_ZERO;
-	}
-	if (req & VM_ALLOC_NODUMP)
+	if ((req & VM_ALLOC_ZERO) != 0)
+		flags = PG_ZERO;
+	flags &= m->flags;
+	if ((req & VM_ALLOC_NODUMP) != 0)
 		flags |= PG_NODUMP;
 	m->flags = flags;
-	mtx_unlock(&vm_page_queue_free_mtx);
 	m->aflags = 0;
 	m->oflags = object == NULL || (object->flags & OBJ_UNMANAGED) != 0 ?
 	    VPO_UNMANAGED : 0;
@@ -1704,7 +1699,7 @@ vm_page_alloc_contig(vm_object_t object,
 	struct vnode *drop;
 	struct spglist deferred_vdrop_list;
 	vm_page_t m, m_tmp, m_ret;
-	u_int flags, oflags;
+	u_int flags;
 	int req_class;
 
 	KASSERT((object != NULL) == ((req & VM_ALLOC_NOOBJ) == 0) &&
@@ -1782,7 +1777,6 @@ retry:
 		flags |= PG_NODUMP;
 	if ((req & VM_ALLOC_WIRED) != 0)
 		atomic_add_int(&cnt.v_wire_count, npages);
-	oflags = VPO_UNMANAGED;
 	if (object != NULL) {
 		if (object->memattr != VM_MEMATTR_DEFAULT &&
 		    memattr == VM_MEMATTR_DEFAULT)
@@ -1801,7 +1795,7 @@ retry:
 		if ((req & VM_ALLOC_WIRED) != 0)
 			m->wire_count = 1;
 		/* Unmanaged pages don't use "act_count". */
-		m->oflags = oflags;
+		m->oflags = VPO_UNMANAGED;
 		if (object != NULL) {
 			if (vm_page_insert(m, object, pindex)) {
 				vm_page_alloc_contig_vdrop(
@@ -1873,16 +1867,12 @@ vm_page_alloc_init(vm_page_t m)
 		    vm_object_cache_is_empty(m_object))
 			drop = m_object->handle;
 	} else {
-		KASSERT(VM_PAGE_IS_FREE(m),
-		    ("vm_page_alloc_init: page %p is not free", m));
 		KASSERT(m->valid == 0,
 		    ("vm_page_alloc_init: free page %p is valid", m));
 		vm_phys_freecnt_adj(m, -1);
 		if ((m->flags & PG_ZERO) != 0)
 			vm_page_zero_count--;
 	}
-	/* Don't clear the PG_ZERO flag; we'll need it later. */
-	m->flags &= PG_ZERO;
 	return (drop);
 }
 
@@ -2211,10 +2201,9 @@ vm_page_cache_turn_free(vm_page_t m)
 
 	m->object = NULL;
 	m->valid = 0;
-	/* Clear PG_CACHED and set PG_FREE. */
-	m->flags ^= PG_CACHED | PG_FREE;
-	KASSERT((m->flags & (PG_CACHED | PG_FREE)) == PG_FREE,
-	    ("vm_page_cache_free: page %p has inconsistent flags", m));
+	KASSERT((m->flags & PG_CACHED) != 0,
+	    ("vm_page_cache_turn_free: page %p is not cached", m));
+	m->flags &= ~PG_CACHED;
 	cnt.v_cache_count--;
 	vm_phys_freecnt_adj(m, 1);
 }
@@ -2240,9 +2229,7 @@ vm_page_free_toq(vm_page_t m)
 		    ("vm_page_free_toq: unmanaged page %p is queued", m));
 	PCPU_INC(cnt.v_tfree);
 
-	if (VM_PAGE_IS_FREE(m))
-		panic("vm_page_free: freeing free page %p", m);
-	else if (vm_page_sbusied(m))
+	if (vm_page_sbusied(m))
 		panic("vm_page_free: freeing busy page %p", m);
 
 	/*
@@ -2284,7 +2271,6 @@ vm_page_free_toq(vm_page_t m)
 		 * cache/free page queues.
 		 */
 		mtx_lock(&vm_page_queue_free_mtx);
-		m->flags |= PG_FREE;
 		vm_phys_freecnt_adj(m, 1);
 #if VM_NRESERVLEVEL > 0
 		if (!vm_reserv_free_page(m))

Modified: head/sys/vm/vm_page.h
==============================================================================
--- head/sys/vm/vm_page.h	Tue Dec 31 17:29:29 2013	(r260136)
+++ head/sys/vm/vm_page.h	Tue Dec 31 18:25:15 2013	(r260137)
@@ -321,7 +321,6 @@ extern struct mtx_padalign pa_lock[];
  * freeing, the modification must be protected by the vm_page lock.
  */
 #define	PG_CACHED	0x0001		/* page is cached */
-#define	PG_FREE		0x0002		/* page is free */
 #define	PG_FICTITIOUS	0x0004		/* physical page doesn't exist */
 #define	PG_ZERO		0x0008		/* page is zeroed */
 #define	PG_MARKER	0x0010		/* special queue marker page */
@@ -372,8 +371,6 @@ extern vm_page_t vm_page_array;		/* Firs
 extern long vm_page_array_size;		/* number of vm_page_t's */
 extern long first_page;			/* first physical page number */
 
-#define	VM_PAGE_IS_FREE(m)	(((m)->flags & PG_FREE) != 0)
-
 #define VM_PAGE_TO_PHYS(entry)	((entry)->phys_addr)
 
 vm_page_t PHYS_TO_VM_PAGE(vm_paddr_t pa);

Modified: head/sys/vm/vm_phys.c
==============================================================================
--- head/sys/vm/vm_phys.c	Tue Dec 31 17:29:29 2013	(r260136)
+++ head/sys/vm/vm_phys.c	Tue Dec 31 18:25:15 2013	(r260137)
@@ -391,7 +391,6 @@ vm_phys_add_page(vm_paddr_t pa)
 	vmd = vm_phys_domain(m);
 	vmd->vmd_page_count++;
 	vmd->vmd_segs |= 1UL << m->segind;
-	m->flags = PG_FREE;
 	KASSERT(m->order == VM_NFREEORDER,
 	    ("vm_phys_add_page: page %p has unexpected order %d",
 	    m, m->order));


More information about the svn-src-head mailing list