diff options
author | alc <alc@FreeBSD.org> | 2002-07-13 19:24:04 +0000 |
---|---|---|
committer | alc <alc@FreeBSD.org> | 2002-07-13 19:24:04 +0000 |
commit | ee4b41f6c5c298c67092747163c8e9c41171419c (patch) | |
tree | 3d08a4951c40ce294b29701865be774c7a89058c /sys/vm/vm_fault.c | |
parent | 1ca394c8d3377f8ca9b2a1516ac08c7c40e0bf6c (diff) | |
download | FreeBSD-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.c | 5 |
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); |