Skip site navigation (1)Skip section navigation (2)
Date:      Wed, 18 Feb 2009 06:43:04 +0000 (UTC)
From:      Alan Cox <alc@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-user@freebsd.org
Subject:   svn commit: r188747 - in user/alc/pagelock/sys: amd64/amd64 vm
Message-ID:  <200902180643.n1I6h4T2048239@svn.freebsd.org>

next in thread | raw e-mail | index | archive | help
Author: alc
Date: Wed Feb 18 06:43:03 2009
New Revision: 188747
URL: http://svn.freebsd.org/changeset/base/188747

Log:
  Replace PG_REFERENCED with VPO_REFERENCED.

Modified:
  user/alc/pagelock/sys/amd64/amd64/pmap.c
  user/alc/pagelock/sys/vm/swap_pager.c
  user/alc/pagelock/sys/vm/vm_fault.c
  user/alc/pagelock/sys/vm/vm_mmap.c
  user/alc/pagelock/sys/vm/vm_object.c
  user/alc/pagelock/sys/vm/vm_page.c
  user/alc/pagelock/sys/vm/vm_page.h
  user/alc/pagelock/sys/vm/vm_pageout.c

Modified: user/alc/pagelock/sys/amd64/amd64/pmap.c
==============================================================================
--- user/alc/pagelock/sys/amd64/amd64/pmap.c	Wed Feb 18 06:33:10 2009	(r188746)
+++ user/alc/pagelock/sys/amd64/amd64/pmap.c	Wed Feb 18 06:43:03 2009	(r188747)
@@ -1896,7 +1896,7 @@ pmap_collect(pmap_t locked_pmap, struct 
 			KASSERT((tpte & PG_W) == 0,
 			    ("pmap_collect: wired pte %#lx", tpte));
 			if (tpte & PG_A)
-				vm_page_flag_set(m, PG_REFERENCED);
+				m->oflags |= VPO_REFERENCED;	/* XXX */
 			if ((tpte & (PG_M | PG_RW)) == (PG_M | PG_RW))
 				vm_page_dirty(m);
 			free = NULL;
@@ -2370,8 +2370,10 @@ pmap_remove_pde(pmap_t pmap, pd_entry_t 
 		    va < eva; va += PAGE_SIZE, m++) {
 			if ((oldpde & (PG_M | PG_RW)) == (PG_M | PG_RW))
 				vm_page_dirty(m);
-			if (oldpde & PG_A)
-				vm_page_flag_set(m, PG_REFERENCED);
+			if (oldpde & PG_A) {
+				VM_OBJECT_LOCK_ASSERT(m->object, MA_OWNED);
+				m->oflags |= VPO_REFERENCED;
+			}
 			if (TAILQ_EMPTY(&m->md.pv_list) &&
 			    TAILQ_EMPTY(&pvh->pv_list))
 				vm_page_flag_clear(m, PG_WRITEABLE);
@@ -2419,8 +2421,10 @@ pmap_remove_pte(pmap_t pmap, pt_entry_t 
 		m = PHYS_TO_VM_PAGE(oldpte & PG_FRAME);
 		if ((oldpte & (PG_M | PG_RW)) == (PG_M | PG_RW))
 			vm_page_dirty(m);
-		if (oldpte & PG_A)
-			vm_page_flag_set(m, PG_REFERENCED);
+		if (oldpte & PG_A) {
+			VM_OBJECT_LOCK_ASSERT(m->object, MA_OWNED);
+			m->oflags |= VPO_REFERENCED;
+		}
 		pmap_remove_entry(pmap, m, va);
 	}
 	return (pmap_unuse_pt(pmap, va, ptepde, free));
@@ -2625,7 +2629,7 @@ pmap_remove_all(vm_page_t m)
 		if (tpte & PG_W)
 			pmap->pm_stats.wired_count--;
 		if (tpte & PG_A)
-			vm_page_flag_set(m, PG_REFERENCED);
+			m->oflags |= VPO_REFERENCED;
 
 		/*
 		 * Update the vm_page_t clean and reference bits.
@@ -2667,7 +2671,7 @@ retry:
 			/*
 			 * In contrast to the analogous operation on a 4KB page
 			 * mapping, the mapping's PG_A flag is not cleared and
-			 * the page's PG_REFERENCED flag is not set.  The
+			 * the page's VPO_REFERENCED flag is not set.  The
 			 * reason is that pmap_demote_pde() expects that a 2MB
 			 * page mapping with a stored page table page has PG_A
 			 * set.
@@ -2716,7 +2720,6 @@ pmap_protect(pmap_t pmap, vm_offset_t sv
 
 	anychanged = 0;
 
-	vm_page_lock_queues();
 	PMAP_LOCK(pmap);
 	for (; sva < eva; sva = va_next) {
 
@@ -2787,7 +2790,9 @@ retry:
 				m = NULL;
 				if (pbits & PG_A) {
 					m = PHYS_TO_VM_PAGE(pbits & PG_FRAME);
-					vm_page_flag_set(m, PG_REFERENCED);
+					VM_OBJECT_LOCK_ASSERT(m->object,
+					    MA_OWNED);
+					m->oflags |= VPO_REFERENCED;
 					pbits &= ~PG_A;
 				}
 				if ((pbits & (PG_M | PG_RW)) == (PG_M | PG_RW)) {
@@ -2815,7 +2820,6 @@ retry:
 	}
 	if (anychanged)
 		pmap_invalidate_all(pmap);
-	vm_page_unlock_queues();
 	PMAP_UNLOCK(pmap);
 }
 
@@ -3084,8 +3088,11 @@ validate:
 			invlva = FALSE;
 			origpte = pte_load_store(pte, newpte);
 			if (origpte & PG_A) {
-				if (origpte & PG_MANAGED)
-					vm_page_flag_set(om, PG_REFERENCED);
+				if (origpte & PG_MANAGED) {
+					VM_OBJECT_LOCK_ASSERT(om->object,
+					    MA_OWNED);
+					om->oflags |= VPO_REFERENCED;
+				}
 				if (opa != VM_PAGE_TO_PHYS(m) || ((origpte &
 				    PG_NX) == 0 && (newpte & PG_NX)))
 					invlva = TRUE;
@@ -4715,10 +4722,10 @@ pmap_mincore(pmap_t pmap, vm_offset_t ad
 			/*
 			 * Modified by someone else
 			 */
-			vm_page_lock_queues();	/* XXX */
+			VM_OBJECT_LOCK(m->object);	/* XXX */
 			if (m->dirty || pmap_is_modified(m))
 				val |= MINCORE_MODIFIED_OTHER;
-			vm_page_unlock_queues();
+			VM_OBJECT_UNLOCK(m->object);
 		}
 		/*
 		 * Referenced by us
@@ -4729,13 +4736,13 @@ pmap_mincore(pmap_t pmap, vm_offset_t ad
 			/*
 			 * Referenced by someone else
 			 */
-			vm_page_lock_queues();	/* XXX */
-			if ((m->flags & PG_REFERENCED) ||
+			VM_OBJECT_LOCK(m->object);	/* XXX */
+			if ((m->oflags & VPO_REFERENCED) ||
 			    pmap_ts_referenced(m)) {
 				val |= MINCORE_REFERENCED_OTHER;
-				vm_page_flag_set(m, PG_REFERENCED);
+				m->oflags |= VPO_REFERENCED;
 			}
-			vm_page_unlock_queues();
+			VM_OBJECT_UNLOCK(m->object);
 		}
 	} 
 	return val;

Modified: user/alc/pagelock/sys/vm/swap_pager.c
==============================================================================
--- user/alc/pagelock/sys/vm/swap_pager.c	Wed Feb 18 06:33:10 2009	(r188746)
+++ user/alc/pagelock/sys/vm/swap_pager.c	Wed Feb 18 06:43:03 2009	(r188747)
@@ -1066,10 +1066,7 @@ swap_pager_getpages(vm_object_t object, 
 	 */
 	VM_OBJECT_LOCK(object);
 	while ((mreq->oflags & VPO_SWAPINPROG) != 0) {
-		mreq->oflags |= VPO_WANTED;
-		vm_page_lock_queues();
-		vm_page_flag_set(mreq, PG_REFERENCED);
-		vm_page_unlock_queues();
+		mreq->oflags |= VPO_REFERENCED | VPO_WANTED;
 		PCPU_INC(cnt.v_intrans);
 		if (msleep(mreq, VM_OBJECT_MTX(object), PSWP, "swread", hz*20)) {
 			printf(

Modified: user/alc/pagelock/sys/vm/vm_fault.c
==============================================================================
--- user/alc/pagelock/sys/vm/vm_fault.c	Wed Feb 18 06:33:10 2009	(r188746)
+++ user/alc/pagelock/sys/vm/vm_fault.c	Wed Feb 18 06:43:03 2009	(r188747)
@@ -933,8 +933,8 @@ vnode_locked:
 		vm_fault_prefault(fs.map->pmap, vaddr, fs.entry);
 	}
 	VM_OBJECT_LOCK(fs.object);
+	fs.m->oflags |= VPO_REFERENCED;
 	vm_page_lock_queues();
-	vm_page_flag_set(fs.m, PG_REFERENCED);
 
 	/*
 	 * If the page is not wired down, then put it where the pageout daemon

Modified: user/alc/pagelock/sys/vm/vm_mmap.c
==============================================================================
--- user/alc/pagelock/sys/vm/vm_mmap.c	Wed Feb 18 06:33:10 2009	(r188746)
+++ user/alc/pagelock/sys/vm/vm_mmap.c	Wed Feb 18 06:43:03 2009	(r188747)
@@ -872,13 +872,11 @@ RestartScan:
 					if (m->dirty ||
 						pmap_is_modified(m))
 						mincoreinfo |= MINCORE_MODIFIED_OTHER;
-					vm_page_lock_queues();
-					if ((m->flags & PG_REFERENCED) ||
+					if ((m->oflags & VPO_REFERENCED) ||
 						pmap_ts_referenced(m)) {
-						vm_page_flag_set(m, PG_REFERENCED);
+						m->oflags |= VPO_REFERENCED;
 						mincoreinfo |= MINCORE_REFERENCED_OTHER;
 					}
-					vm_page_unlock_queues();
 				}
 				VM_OBJECT_UNLOCK(current->object.vm_object);
 			}

Modified: user/alc/pagelock/sys/vm/vm_object.c
==============================================================================
--- user/alc/pagelock/sys/vm/vm_object.c	Wed Feb 18 06:33:10 2009	(r188746)
+++ user/alc/pagelock/sys/vm/vm_object.c	Wed Feb 18 06:43:03 2009	(r188747)
@@ -1166,11 +1166,10 @@ shadowlookup:
 			goto unlock_tobject;
 		}
 		if ((m->oflags & VPO_BUSY) || m->busy) {
-			vm_page_flag_set(m, PG_REFERENCED);
 			vm_page_unlock_queues();
 			if (object != tobject)
 				VM_OBJECT_UNLOCK(object);
-			m->oflags |= VPO_WANTED;
+			m->oflags |= VPO_REFERENCED | VPO_WANTED;
 			msleep(m, VM_OBJECT_MTX(tobject), PDROP | PVM, "madvpo", 0);
 			VM_OBJECT_LOCK(object);
   			goto relookup;
@@ -1368,10 +1367,9 @@ retry:
 		 * not be changed by this operation.
 		 */
 		if ((m->oflags & VPO_BUSY) || m->busy) {
-			vm_page_flag_set(m, PG_REFERENCED);
 			vm_page_unlock_queues();
 			VM_OBJECT_UNLOCK(new_object);
-			m->oflags |= VPO_WANTED;
+			m->oflags |= VPO_REFERENCED | VPO_WANTED;
 			msleep(m, VM_OBJECT_MTX(orig_object), PVM, "spltwt", 0);
 			VM_OBJECT_LOCK(new_object);
 			goto retry;
@@ -1506,11 +1504,8 @@ vm_object_backing_scan(vm_object_t objec
 				}
 			} else if (op & OBSC_COLLAPSE_WAIT) {
 				if ((p->oflags & VPO_BUSY) || p->busy) {
-					vm_page_lock_queues();
-					vm_page_flag_set(p, PG_REFERENCED);
-					vm_page_unlock_queues();
 					VM_OBJECT_UNLOCK(object);
-					p->oflags |= VPO_WANTED;
+					p->oflags |= VPO_REFERENCED | VPO_WANTED;
 					msleep(p, VM_OBJECT_MTX(backing_object),
 					    PDROP | PVM, "vmocol", 0);
 					VM_OBJECT_LOCK(object);

Modified: user/alc/pagelock/sys/vm/vm_page.c
==============================================================================
--- user/alc/pagelock/sys/vm/vm_page.c	Wed Feb 18 06:33:10 2009	(r188746)
+++ user/alc/pagelock/sys/vm/vm_page.c	Wed Feb 18 06:43:03 2009	(r188747)
@@ -542,10 +542,8 @@ vm_page_sleep(vm_page_t m, const char *m
 {
 
 	VM_OBJECT_LOCK_ASSERT(m->object, MA_OWNED);
-	if (!mtx_owned(&vm_page_queue_mtx))
-		vm_page_lock_queues();
-	vm_page_flag_set(m, PG_REFERENCED);
-	vm_page_unlock_queues();
+	if (mtx_owned(&vm_page_queue_mtx))
+		vm_page_unlock_queues();
 
 	/*
 	 * It's possible that while we sleep, the page will get
@@ -554,7 +552,7 @@ vm_page_sleep(vm_page_t m, const char *m
 	 * such that even if m->object changes, we can re-lock
 	 * it.
 	 */
-	m->oflags |= VPO_WANTED;
+	m->oflags |= VPO_REFERENCED | VPO_WANTED;
 	msleep(m, VM_OBJECT_MTX(m->object), PVM, msg, 0);
 }
 
@@ -1760,7 +1758,7 @@ vm_page_dontneed(vm_page_t m)
 	 * Clear any references to the page.  Otherwise, the page daemon will
 	 * immediately reactivate the page.
 	 */
-	vm_page_flag_clear(m, PG_REFERENCED);
+	m->oflags &= ~VPO_REFERENCED;
 	pmap_clear_reference(m);
 
 	if (m->dirty == 0 && pmap_is_modified(m))

Modified: user/alc/pagelock/sys/vm/vm_page.h
==============================================================================
--- user/alc/pagelock/sys/vm/vm_page.h	Wed Feb 18 06:33:10 2009	(r188746)
+++ user/alc/pagelock/sys/vm/vm_page.h	Wed Feb 18 06:43:03 2009	(r188747)
@@ -146,6 +146,7 @@ struct vm_page {
  */
 #define	VPO_BUSY	0x0001	/* page is in transit */
 #define	VPO_WANTED	0x0002	/* someone is waiting for page */
+#define	VPO_REFERENCED	0x0080	/* page has been referenced */
 #define	VPO_CLEANCHK	0x0100	/* page will be checked for cleaning */
 #define	VPO_SWAPINPROG	0x0200	/* swap I/O in progress on page */
 #define	VPO_NOSYNC	0x0400	/* do not collect for syncer */
@@ -192,7 +193,6 @@ extern struct mtx vm_page_queue_free_mtx
 #define	PG_FICTITIOUS	0x0008		/* physical page doesn't exist (O) */
 #define	PG_WRITEABLE	0x0010		/* page is mapped writeable */
 #define	PG_ZERO		0x0040		/* page is zeroed */
-#define PG_REFERENCED	0x0080		/* page has been referenced */
 #define PG_UNMANAGED	0x0800		/* No PV management for page */
 #define PG_MARKER	0x1000		/* special queue marker page */
 #define	PG_SLAB		0x2000		/* object pointer is actually a slab */

Modified: user/alc/pagelock/sys/vm/vm_pageout.c
==============================================================================
--- user/alc/pagelock/sys/vm/vm_pageout.c	Wed Feb 18 06:33:10 2009	(r188746)
+++ user/alc/pagelock/sys/vm/vm_pageout.c	Wed Feb 18 06:43:03 2009	(r188747)
@@ -551,17 +551,17 @@ vm_pageout_object_deactivate_pages(pmap,
 			}
 			actcount = pmap_ts_referenced(p);
 			if (actcount) {
-				vm_page_flag_set(p, PG_REFERENCED);
-			} else if (p->flags & PG_REFERENCED) {
+				p->oflags |= VPO_REFERENCED;
+			} else if (p->oflags & VPO_REFERENCED) {
 				actcount = 1;
 			}
 			if ((p->queue != PQ_ACTIVE) &&
-				(p->flags & PG_REFERENCED)) {
+			    (p->oflags & VPO_REFERENCED)) {
 				vm_page_activate(p);
 				p->act_count += actcount;
-				vm_page_flag_clear(p, PG_REFERENCED);
+				p->oflags &= ~VPO_REFERENCED;
 			} else if (p->queue == PQ_ACTIVE) {
-				if ((p->flags & PG_REFERENCED) == 0) {
+				if ((p->oflags & VPO_REFERENCED) == 0) {
 					p->act_count -= min(p->act_count, ACT_DECLINE);
 					if (!remove_mode && (vm_pageout_algorithm || (p->act_count == 0))) {
 						pmap_remove_all(p);
@@ -571,7 +571,7 @@ vm_pageout_object_deactivate_pages(pmap,
 					}
 				} else {
 					vm_page_activate(p);
-					vm_page_flag_clear(p, PG_REFERENCED);
+					p->oflags &= ~VPO_REFERENCED;
 					if (p->act_count < (ACT_MAX - ACT_ADVANCE))
 						p->act_count += ACT_ADVANCE;
 					vm_page_requeue(p);
@@ -785,7 +785,7 @@ rescan0:
 		 * references.
 		 */
 		if (object->ref_count == 0) {
-			vm_page_flag_clear(m, PG_REFERENCED);
+			m->oflags &= ~VPO_REFERENCED;
 			pmap_clear_reference(m);
 
 		/*
@@ -797,7 +797,7 @@ rescan0:
 		 * level VM system not knowing anything about existing 
 		 * references.
 		 */
-		} else if (((m->flags & PG_REFERENCED) == 0) &&
+		} else if ((m->oflags & VPO_REFERENCED) == 0 &&
 			(actcount = pmap_ts_referenced(m))) {
 			vm_page_activate(m);
 			VM_OBJECT_UNLOCK(object);
@@ -811,8 +811,8 @@ rescan0:
 		 * "activation count" higher than normal so that we will less 
 		 * likely place pages back onto the inactive queue again.
 		 */
-		if ((m->flags & PG_REFERENCED) != 0) {
-			vm_page_flag_clear(m, PG_REFERENCED);
+		if ((m->oflags & VPO_REFERENCED) != 0) {
+			m->oflags &= ~VPO_REFERENCED;
 			actcount = pmap_ts_referenced(m);
 			vm_page_activate(m);
 			VM_OBJECT_UNLOCK(object);
@@ -1091,7 +1091,7 @@ unlock_and_continue:
 		 */
 		actcount = 0;
 		if (object->ref_count != 0) {
-			if (m->flags & PG_REFERENCED) {
+			if (m->oflags & VPO_REFERENCED) {
 				actcount += 1;
 			}
 			actcount += pmap_ts_referenced(m);
@@ -1105,7 +1105,7 @@ unlock_and_continue:
 		/*
 		 * Since we have "tested" this bit, we need to clear it now.
 		 */
-		vm_page_flag_clear(m, PG_REFERENCED);
+		m->oflags &= ~VPO_REFERENCED;
 
 		/*
 		 * Only if an object is currently being used, do we use the
@@ -1329,8 +1329,8 @@ vm_pageout_page_stats()
 		}
 
 		actcount = 0;
-		if (m->flags & PG_REFERENCED) {
-			vm_page_flag_clear(m, PG_REFERENCED);
+		if (m->oflags & VPO_REFERENCED) {
+			m->oflags &= ~VPO_REFERENCED;
 			actcount += 1;
 		}
 



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