From e5a1e3a50792b9429989a8add50a7dfeae7c36fb Mon Sep 17 00:00:00 2001 From: Justus Winter <4winter@informatik.uni-hamburg.de> Date: Tue, 21 Jul 2015 00:05:52 +0200 Subject: yyy vm: destroy pages --- vm/vm_object.c | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/vm/vm_object.c b/vm/vm_object.c index 3c7d73c..c650b8c 100644 --- a/vm/vm_object.c +++ b/vm/vm_object.c @@ -735,7 +735,7 @@ void memory_object_release( void vm_object_abort_activity( vm_object_t object) { - vm_page_t p; + vm_page_t p, old_p; /* * Abort all activity that would be waiting @@ -747,6 +747,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. @@ -759,8 +760,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); } -- cgit v1.2.3