svn commit: r188811 - in user/alc/pagelock/sys: amd64/amd64 kern vm
Alan Cox
alc at FreeBSD.org
Thu Feb 19 00:25:30 PST 2009
Author: alc
Date: Thu Feb 19 08:25:29 2009
New Revision: 188811
URL: http://svn.freebsd.org/changeset/base/188811
Log:
Replace PG_WRITEABLE by VPO_WRITEABLE. Eliminate unnecessary page queues
locking.
Modified:
user/alc/pagelock/sys/amd64/amd64/pmap.c
user/alc/pagelock/sys/kern/vfs_bio.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 Thu Feb 19 06:25:29 2009 (r188810)
+++ user/alc/pagelock/sys/amd64/amd64/pmap.c Thu Feb 19 08:25:29 2009 (r188811)
@@ -1471,11 +1471,9 @@ _pmap_allocpte(pmap_t pmap, vm_pindex_t
VM_ALLOC_WIRED | VM_ALLOC_ZERO)) == NULL) {
if (flags & M_WAITOK) {
PMAP_UNLOCK(pmap);
- vm_page_unlock_queues();
vm_object_unlock_all(object);
VM_WAIT;
vm_object_lock_all(object);
- vm_page_lock_queues();
PMAP_LOCK(pmap);
}
@@ -1907,7 +1905,7 @@ pmap_collect(pmap_t locked_pmap, struct
if (TAILQ_EMPTY(&m->md.pv_list)) {
pvh = pa_to_pvh(VM_PAGE_TO_PHYS(m));
if (TAILQ_EMPTY(&pvh->pv_list))
- vm_page_flag_clear(m, PG_WRITEABLE);
+ m->oflags &= ~VPO_WRITEABLE; /* XXX */
}
free_pv_entry(pmap, pv);
if (pmap != locked_pmap)
@@ -1949,7 +1947,8 @@ free_pv_entry(pmap_t pmap, pv_entry_t pv
TAILQ_REMOVE(&pmap->pm_pvchunk, pc, pc_list);
m = PHYS_TO_VM_PAGE(DMAP_TO_PHYS((vm_offset_t)pc));
dump_drop_page(m->phys_addr);
- vm_page_unwire(m, 0);
+ m->wire_count--;
+ atomic_subtract_int(&cnt.v_wire_count, 1);
vm_page_free(m);
}
@@ -2164,7 +2163,7 @@ pmap_remove_entry(pmap_t pmap, vm_page_t
if (TAILQ_EMPTY(&m->md.pv_list)) {
pvh = pa_to_pvh(VM_PAGE_TO_PHYS(m));
if (TAILQ_EMPTY(&pvh->pv_list))
- vm_page_flag_clear(m, PG_WRITEABLE);
+ m->oflags &= ~VPO_WRITEABLE;
}
}
@@ -2375,8 +2374,10 @@ pmap_remove_pde(pmap_t pmap, pd_entry_t
m->oflags |= VPO_REFERENCED;
}
if (TAILQ_EMPTY(&m->md.pv_list) &&
- TAILQ_EMPTY(&pvh->pv_list))
- vm_page_flag_clear(m, PG_WRITEABLE);
+ TAILQ_EMPTY(&pvh->pv_list)) {
+ VM_OBJECT_LOCK_ASSERT(m->object, MA_OWNED);
+ m->oflags &= ~VPO_WRITEABLE;
+ }
}
}
if (pmap == kernel_pmap) {
@@ -2473,7 +2474,6 @@ pmap_remove(pmap_t pmap, vm_offset_t sva
anyvalid = 0;
- vm_page_lock_queues();
PMAP_LOCK(pmap);
/*
@@ -2576,7 +2576,6 @@ pmap_remove(pmap_t pmap, vm_offset_t sva
out:
if (anyvalid)
pmap_invalidate_all(pmap);
- vm_page_unlock_queues();
PMAP_UNLOCK(pmap);
pmap_free_zero_pages(free);
}
@@ -2644,7 +2643,7 @@ pmap_remove_all(vm_page_t m)
free_pv_entry(pmap, pv);
PMAP_UNLOCK(pmap);
}
- vm_page_flag_clear(m, PG_WRITEABLE);
+ m->oflags &= ~VPO_WRITEABLE;
}
/*
@@ -2967,7 +2966,6 @@ pmap_enter(pmap_t pmap, vm_offset_t va,
mpte = NULL;
- vm_page_lock_queues();
PMAP_LOCK(pmap);
/*
@@ -3065,7 +3063,8 @@ validate:
newpte = (pt_entry_t)(pa | PG_V);
if ((prot & VM_PROT_WRITE) != 0) {
newpte |= PG_RW;
- vm_page_flag_set(m, PG_WRITEABLE);
+ VM_OBJECT_LOCK_ASSERT(m->object, MA_OWNED);
+ m->oflags |= VPO_WRITEABLE;
}
if ((prot & VM_PROT_EXECUTE) == 0)
newpte |= pg_nx;
@@ -3117,7 +3116,6 @@ validate:
pg_ps_enabled && vm_reserv_level_iffullpop(m) == 0)
pmap_promote_pde(pmap, pde, va);
- vm_page_unlock_queues();
PMAP_UNLOCK(pmap);
}
@@ -3913,7 +3911,7 @@ restart:
if (TAILQ_EMPTY(&pvh->pv_list)) {
for (mt = m; mt < &m[NBPDR / PAGE_SIZE]; mt++)
if (TAILQ_EMPTY(&mt->md.pv_list))
- vm_page_flag_clear(mt, PG_WRITEABLE);
+ mt->oflags &= ~VPO_WRITEABLE;
}
mpte = pmap_lookup_pt_page(pmap, pv->pv_va);
if (mpte != NULL) {
@@ -3932,7 +3930,7 @@ restart:
if (TAILQ_EMPTY(&m->md.pv_list)) {
pvh = pa_to_pvh(VM_PAGE_TO_PHYS(m));
if (TAILQ_EMPTY(&pvh->pv_list))
- vm_page_flag_clear(m, PG_WRITEABLE);
+ m->oflags &= ~VPO_WRITEABLE;
}
pmap_unuse_pt(pmap, pv->pv_va, *pde, &free);
}
@@ -3949,7 +3947,8 @@ restart:
TAILQ_REMOVE(&pmap->pm_pvchunk, pc, pc_list);
m = PHYS_TO_VM_PAGE(DMAP_TO_PHYS((vm_offset_t)pc));
dump_drop_page(m->phys_addr);
- vm_page_unwire(m, 0);
+ m->wire_count--;
+ atomic_subtract_int(&cnt.v_wire_count, 1);
vm_page_free(m);
}
}
@@ -4041,7 +4040,7 @@ pmap_remove_write(vm_page_t m)
vm_offset_t va;
if ((m->flags & PG_FICTITIOUS) != 0 ||
- (m->flags & PG_WRITEABLE) == 0)
+ (m->oflags & VPO_WRITEABLE) == 0)
return;
VM_OBJECT_LOCK_ASSERT(m->object, MA_OWNED);
pvh = pa_to_pvh(VM_PAGE_TO_PHYS(m));
@@ -4073,7 +4072,7 @@ retry:
}
PMAP_UNLOCK(pmap);
}
- vm_page_flag_clear(m, PG_WRITEABLE);
+ m->oflags &= ~VPO_WRITEABLE;
}
/*
Modified: user/alc/pagelock/sys/kern/vfs_bio.c
==============================================================================
--- user/alc/pagelock/sys/kern/vfs_bio.c Thu Feb 19 06:25:29 2009 (r188810)
+++ user/alc/pagelock/sys/kern/vfs_bio.c Thu Feb 19 08:25:29 2009 (r188811)
@@ -1287,9 +1287,7 @@ brelse(struct buf *bp)
(PAGE_SIZE - poffset) : resid;
KASSERT(presid >= 0, ("brelse: extra page"));
- vm_page_lock_queues();
vm_page_set_invalid(m, poffset, presid);
- vm_page_unlock_queues();
if (had_bogus)
printf("avoided corruption bug in bogus_page/brelse code\n");
}
@@ -3393,7 +3391,6 @@ retry:
goto retry;
}
bogus = 0;
- vm_page_lock_queues();
for (i = 0; i < bp->b_npages; i++) {
m = bp->b_pages[i];
@@ -3426,7 +3423,6 @@ retry:
}
foff = (foff + PAGE_SIZE) & ~(off_t)PAGE_MASK;
}
- vm_page_unlock_queues();
VM_OBJECT_UNLOCK(obj);
if (bogus)
pmap_qenter(trunc_page((vm_offset_t)bp->b_data),
Modified: user/alc/pagelock/sys/vm/vm_page.c
==============================================================================
--- user/alc/pagelock/sys/vm/vm_page.c Thu Feb 19 06:25:29 2009 (r188810)
+++ user/alc/pagelock/sys/vm/vm_page.c Thu Feb 19 08:25:29 2009 (r188811)
@@ -699,7 +699,7 @@ vm_page_insert(vm_page_t m, vm_object_t
* Since we are inserting a new and possibly dirty page,
* update the object's OBJ_MIGHTBEDIRTY flag.
*/
- if (m->flags & PG_WRITEABLE)
+ if (m->oflags & VPO_WRITEABLE)
vm_object_set_writeable_dirty(object);
}
@@ -1949,7 +1949,6 @@ vm_page_set_invalid(vm_page_t m, int bas
VM_OBJECT_LOCK_ASSERT(m->object, MA_OWNED);
bits = vm_page_bits(base, size);
- mtx_assert(&vm_page_queue_mtx, MA_OWNED);
if (m->valid == VM_PAGE_BITS_ALL && bits != 0)
pmap_remove_all(m);
m->valid &= ~bits;
Modified: user/alc/pagelock/sys/vm/vm_page.h
==============================================================================
--- user/alc/pagelock/sys/vm/vm_page.h Thu Feb 19 06:25:29 2009 (r188810)
+++ user/alc/pagelock/sys/vm/vm_page.h Thu Feb 19 08:25:29 2009 (r188811)
@@ -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_WRITEABLE 0x0010 /* page is mapped writeable */
#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 */
@@ -191,7 +192,6 @@ extern struct mtx vm_page_queue_free_mtx
#define PG_FREE 0x0002 /* page is free */
#define PG_WINATCFLS 0x0004 /* flush dirty page on inactive q */
#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_UNMANAGED 0x0800 /* No PV management for page */
#define PG_MARKER 0x1000 /* special queue marker page */
Modified: user/alc/pagelock/sys/vm/vm_pageout.c
==============================================================================
--- user/alc/pagelock/sys/vm/vm_pageout.c Thu Feb 19 06:25:29 2009 (r188810)
+++ user/alc/pagelock/sys/vm/vm_pageout.c Thu Feb 19 08:25:29 2009 (r188811)
@@ -449,7 +449,7 @@ vm_pageout_flush(vm_page_t *mc, int coun
vm_page_t mt = mc[i];
KASSERT(pageout_status[i] == VM_PAGER_PEND ||
- (mt->flags & PG_WRITEABLE) == 0,
+ (mt->oflags & VPO_WRITEABLE) == 0,
("vm_pageout_flush: page %p is not write protected", mt));
switch (pageout_status[i]) {
case VM_PAGER_OK:
@@ -840,7 +840,7 @@ rescan0:
* to the page, removing all access will be cheaper
* overall.
*/
- if ((m->flags & PG_WRITEABLE) != 0)
+ if ((m->oflags & VPO_WRITEABLE) != 0)
pmap_remove_all(m);
} else {
vm_page_dirty(m);
More information about the svn-src-user
mailing list