summaryrefslogtreecommitdiffstats
path: root/sys/vm/vm_fault.c
diff options
context:
space:
mode:
authoralc <alc@FreeBSD.org>2002-07-13 19:24:04 +0000
committeralc <alc@FreeBSD.org>2002-07-13 19:24:04 +0000
commitee4b41f6c5c298c67092747163c8e9c41171419c (patch)
tree3d08a4951c40ce294b29701865be774c7a89058c /sys/vm/vm_fault.c
parent1ca394c8d3377f8ca9b2a1516ac08c7c40e0bf6c (diff)
downloadFreeBSD-src-ee4b41f6c5c298c67092747163c8e9c41171419c.zip
FreeBSD-src-ee4b41f6c5c298c67092747163c8e9c41171419c.tar.gz
o Lock some page queue accesses, in particular, those by vm_page_unwire().
Diffstat (limited to 'sys/vm/vm_fault.c')
-rw-r--r--sys/vm/vm_fault.c5
1 files changed, 4 insertions, 1 deletions
diff --git a/sys/vm/vm_fault.c b/sys/vm/vm_fault.c
index 5ad6292..c341661 100644
--- a/sys/vm/vm_fault.c
+++ b/sys/vm/vm_fault.c
@@ -866,6 +866,7 @@ readrest:
if (((fault_flags & VM_FAULT_WIRE_MASK) == 0) && (wired == 0)) {
pmap_prefault(fs.map->pmap, vaddr, fs.entry);
}
+ vm_page_lock_queues();
vm_page_flag_clear(fs.m, PG_ZERO);
vm_page_flag_set(fs.m, PG_MAPPED|PG_REFERENCED);
@@ -881,7 +882,7 @@ readrest:
} else {
vm_page_activate(fs.m);
}
-
+ vm_page_unlock_queues();
mtx_lock_spin(&sched_lock);
if (curproc && (curproc->p_sflag & PS_INMEM) && curproc->p_stats) {
if (hardfault) {
@@ -1004,7 +1005,9 @@ vm_fault_unwire(map, start, end)
pa = pmap_extract(pmap, va);
if (pa != (vm_offset_t) 0) {
pmap_change_wiring(pmap, va, FALSE);
+ vm_page_lock_queues();
vm_page_unwire(PHYS_TO_VM_PAGE(pa), 1);
+ vm_page_unlock_queues();
}
}
mtx_unlock(&Giant);
OpenPOWER on IntegriCloud