diff options
-rw-r--r-- | vm/vm_object.c | 4 | ||||
-rw-r--r-- | vm/vm_resident.c | 2 | ||||
-rw-r--r-- | vm/vm_user.c | 4 |
3 files changed, 10 insertions, 0 deletions
diff --git a/vm/vm_object.c b/vm/vm_object.c index c238cce4..9a46149b 100644 --- a/vm/vm_object.c +++ b/vm/vm_object.c @@ -1066,10 +1066,14 @@ kern_return_t vm_object_copy_slowly( vm_page_t new_page; vm_fault_return_t result; + vm_object_lock(new_object); while ((new_page = vm_page_alloc(new_object, new_offset)) == VM_PAGE_NULL) { + vm_object_unlock(new_object); VM_PAGE_WAIT((void (*)()) 0); + vm_object_lock(new_object); } + vm_object_unlock(new_object); do { vm_prot_t prot = VM_PROT_READ; diff --git a/vm/vm_resident.c b/vm/vm_resident.c index 2117c0b1..817e4e8c 100644 --- a/vm/vm_resident.c +++ b/vm/vm_resident.c @@ -743,6 +743,7 @@ boolean_t vm_page_convert(struct vm_page **mp) object = fict_m->object; offset = fict_m->offset; + vm_page_lock_queues(); vm_page_remove(fict_m); memcpy(&real_m->vm_page_header, @@ -751,6 +752,7 @@ boolean_t vm_page_convert(struct vm_page **mp) real_m->fictitious = FALSE; vm_page_insert(real_m, object, offset); + vm_page_unlock_queues(); assert(real_m->phys_addr != vm_page_fictitious_addr); assert(fict_m->fictitious); diff --git a/vm/vm_user.c b/vm/vm_user.c index 62aedad3..7f706d71 100644 --- a/vm/vm_user.c +++ b/vm/vm_user.c @@ -692,8 +692,12 @@ kern_return_t vm_allocate_contiguous( return kr; } + vm_object_lock(object); + vm_page_lock_queues(); for (i = 0; i < vm_page_atop(size); i++) vm_page_unwire(&pages[i]); + vm_page_unlock_queues(); + vm_object_unlock(object); *result_vaddr = vaddr; *result_paddr = pages->phys_addr; |