summaryrefslogtreecommitdiff
path: root/vm
diff options
context:
space:
mode:
authorJustus Winter <4winter@informatik.uni-hamburg.de>2015-07-21 00:05:52 +0200
committerJustus Winter <4winter@informatik.uni-hamburg.de>2015-09-14 14:48:13 +0200
commitaa5368c1ecfd59ddcd4967e2fb9cf0420fe430d4 (patch)
tree7e39a1f7c75ddbc426398a1975bc6dc8863c742f /vm
parentcffbf7da5b877fb86feb080f1a1022a5d134f63e (diff)
yyy vm: destroy pages
Diffstat (limited to 'vm')
-rw-r--r--vm/vm_object.c13
1 files changed, 11 insertions, 2 deletions
diff --git a/vm/vm_object.c b/vm/vm_object.c
index 3b7506d..344ce5e 100644
--- a/vm/vm_object.c
+++ b/vm/vm_object.c
@@ -756,7 +756,7 @@ void memory_object_release(
void vm_object_abort_activity(
vm_object_t object)
{
- vm_page_t p;
+ vm_page_t p, old_p;
assert(have_vm_object_lock(object));
@@ -770,6 +770,7 @@ void vm_object_abort_activity(
*/
struct rdxtree_iter iter;
+ old_p = NULL;
rdxtree_for_each(&object->memt, &iter, p) {
/*
* If it's being paged in, destroy it.
@@ -782,8 +783,16 @@ void vm_object_abort_activity(
else {
if (p->unlock_request != VM_PROT_NONE)
p->unlock_request = VM_PROT_NONE;
- PAGE_WAKEUP(p);
+ if (p == old_p)
+ /* We tried to wake this up last time.
+ We must assume this failed, and
+ destroy this page to avoid looping
+ forever. */
+ VM_PAGE_FREE(p);
+ else
+ PAGE_WAKEUP(p);
}
+ old_p = p;
rdxtree_iter_init(&iter);
}