summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSamuel Thibault <samuel.thibault@ens-lyon.org>2025-02-12 01:54:25 +0100
committerSamuel Thibault <samuel.thibault@ens-lyon.org>2025-02-12 01:54:25 +0100
commitaa8a47f7b9da61e689b0c4bb37e7a2a84ece6dac (patch)
treedb06ee040cc25bc88ee860d471fb111423476dae
parent98794c61f45a41144af3c39498444d215b425e62 (diff)
vm: Add missing locking
-rw-r--r--vm/vm_object.c4
-rw-r--r--vm/vm_resident.c2
-rw-r--r--vm/vm_user.c4
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;