summaryrefslogtreecommitdiff
path: root/vm/vm_object.c
diff options
context:
space:
mode:
authorMichael Kelly <mike@weatherwax.co.uk>2025-06-08 17:27:13 +0200
committerSamuel Thibault <samuel.thibault@ens-lyon.org>2025-06-08 17:27:13 +0200
commit6d422d5588b830464b31680a9076144a2b594113 (patch)
treeb74caffc66dbbe893cae27dc0191e13721620d62 /vm/vm_object.c
parentdd50871dc76c4b9ea5f127924f02ec082d88b165 (diff)
vm_object_pmap_remove: Also remove in the shadow object
Otherwise, when e.g. terminating tasks with shared mappings, some references remain within the pv_head_table to pmap_t objects that had already been destroyed.
Diffstat (limited to 'vm/vm_object.c')
-rw-r--r--vm/vm_object.c18
1 files changed, 17 insertions, 1 deletions
diff --git a/vm/vm_object.c b/vm/vm_object.c
index 3e6b28c4..2dba76b1 100644
--- a/vm/vm_object.c
+++ b/vm/vm_object.c
@@ -986,12 +986,28 @@ void vm_object_pmap_remove(
return;
vm_object_lock(object);
- queue_iterate(&object->memq, p, vm_page_t, listq) {
+
+ while (TRUE) {
+ queue_iterate(&object->memq, p, vm_page_t, listq) {
if (!p->fictitious &&
(start <= p->offset) &&
(p->offset < end))
pmap_page_protect(p->phys_addr, VM_PROT_NONE);
+ }
+
+ if (object->shadow == VM_OBJECT_NULL)
+ break;
+
+ vm_object_t prev_object = object;
+
+ start += object->shadow_offset;
+ end += object->shadow_offset;
+ object = object->shadow;
+
+ vm_object_lock(object);
+ vm_object_unlock(prev_object);
}
+
vm_object_unlock(object);
}