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>