svn commit: r188747 - in user/alc/pagelock/sys: amd64/amd64 vm
Alan Cox
alc at FreeBSD.org
Tue Feb 17 22:43:05 PST 2009
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;
}
More information about the svn-src-user
mailing list