diff options
author | alc <alc@FreeBSD.org> | 2002-07-27 07:20:27 +0000 |
---|---|---|
committer | alc <alc@FreeBSD.org> | 2002-07-27 07:20:27 +0000 |
commit | d40c5cf5052f8ed1eb6fc73b6ba06b165130c212 (patch) | |
tree | abe21ca84d129bcdd57588695d506a03dfedda4e /sys/vm/vm_fault.c | |
parent | c9b1c04c4810957add0d23d801b72085949552b2 (diff) | |
download | FreeBSD-src-d40c5cf5052f8ed1eb6fc73b6ba06b165130c212.zip FreeBSD-src-d40c5cf5052f8ed1eb6fc73b6ba06b165130c212.tar.gz |
o Lock page queue accesses by vm_page_activate().
Diffstat (limited to 'sys/vm/vm_fault.c')
-rw-r--r-- | sys/vm/vm_fault.c | 6 |
1 files changed, 6 insertions, 0 deletions
diff --git a/sys/vm/vm_fault.c b/sys/vm/vm_fault.c index d8f1d60..2e347a1 100644 --- a/sys/vm/vm_fault.c +++ b/sys/vm/vm_fault.c @@ -345,7 +345,9 @@ RetryFault:; * around with a vm_page_t->busy page except, perhaps, * to pmap it. */ + vm_page_lock_queues(); if ((fs.m->flags & PG_BUSY) || fs.m->busy) { + vm_page_unlock_queues(); unlock_things(&fs); (void)vm_page_sleep_busy(fs.m, TRUE, "vmpfw"); cnt.v_intrans++; @@ -360,6 +362,7 @@ RetryFault:; if ((queue - fs.m->pc) == PQ_CACHE && vm_page_count_severe()) { vm_page_activate(fs.m); + vm_page_unlock_queues(); unlock_and_deallocate(&fs); VM_WAITPFAULT; goto RetryFault; @@ -372,6 +375,7 @@ RetryFault:; * found the page ). */ vm_page_busy(fs.m); + vm_page_unlock_queues(); if (((fs.m->valid & VM_PAGE_BITS_ALL) != VM_PAGE_BITS_ALL) && fs.m->object != kernel_object && fs.m->object != kmem_object) { goto readrest; @@ -1072,6 +1076,7 @@ vm_fault_copy_entry(dst_map, src_map, dst_entry, src_entry) */ vm_page_flag_clear(dst_m, PG_ZERO); pmap_enter(dst_map->pmap, vaddr, dst_m, prot, FALSE); + vm_page_lock_queues(); vm_page_flag_set(dst_m, PG_WRITEABLE|PG_MAPPED); /* @@ -1079,6 +1084,7 @@ vm_fault_copy_entry(dst_map, src_map, dst_entry, src_entry) */ vm_page_activate(dst_m); vm_page_wakeup(dst_m); + vm_page_unlock_queues(); } } |