diff options
author | alc <alc@FreeBSD.org> | 2004-09-03 05:11:32 +0000 |
---|---|---|
committer | alc <alc@FreeBSD.org> | 2004-09-03 05:11:32 +0000 |
commit | 82e55fdf7687982550eb5f4127031095fdf8d75a (patch) | |
tree | 354bad52910b678ed5b43b366707bc35dc3371aa /sys/vm/vm_fault.c | |
parent | 5aa2eb98b7e705cdbac165895e81d5e4bd6b5453 (diff) | |
download | FreeBSD-src-82e55fdf7687982550eb5f4127031095fdf8d75a.zip FreeBSD-src-82e55fdf7687982550eb5f4127031095fdf8d75a.tar.gz |
Push Giant deep into vm_forkproc(), acquiring it only if the process has
mapped System V shared memory segments (see shmfork_myhook()) or requires
the allocation of an ldt (see vm_fault_wire()).
Diffstat (limited to 'sys/vm/vm_fault.c')
-rw-r--r-- | sys/vm/vm_fault.c | 4 |
1 files changed, 4 insertions, 0 deletions
diff --git a/sys/vm/vm_fault.c b/sys/vm/vm_fault.c index b6e8b52..16f8272 100644 --- a/sys/vm/vm_fault.c +++ b/sys/vm/vm_fault.c @@ -1026,9 +1026,13 @@ vm_fault_wire(vm_map_t map, vm_offset_t start, vm_offset_t end, * read-only sections. */ for (va = start; va < end; va += PAGE_SIZE) { + if (map->system_map) + mtx_lock(&Giant); rv = vm_fault(map, va, user_wire ? VM_PROT_READ : VM_PROT_READ | VM_PROT_WRITE, user_wire ? VM_FAULT_USER_WIRE : VM_FAULT_CHANGE_WIRING); + if (map->system_map) + mtx_unlock(&Giant); if (rv) { if (va != start) vm_fault_unwire(map, start, va, fictitious); |