From 833c1b0520f0e85d16f32d8f65f73a0df2d677d4 Mon Sep 17 00:00:00 2001 From: Gleb Koval Date: Thu, 5 Dec 2024 22:37:14 +0000 Subject: [PATCH] fix: only swap out shared pages once --- src/vm/page.c | 18 ++++++++++++++---- 1 file changed, 14 insertions(+), 4 deletions(-) diff --git a/src/vm/page.c b/src/vm/page.c index 1a68430..b617994 100644 --- a/src/vm/page.c +++ b/src/vm/page.c @@ -71,17 +71,19 @@ static void page_set_swap (struct thread *owner, uint32_t *pte, bool page_insert_swapped (void *upage, void *kpage, struct list *owners) { + struct file *exec_file = NULL; struct list_elem *e; for (e = list_begin (owners); e != list_end (owners); e = list_next (e)) { struct thread *owner = list_entry (e, struct frame_owner, elem)->owner; uint32_t *pte = lookup_page (owner->pagedir, upage, false); - if (page_is_shared_pte (pte)) + if (exec_file != NULL || page_is_shared_pte (pte)) { - ASSERT (list_size (owners) == 1); + ASSERT (page_is_shared_pte (pte)); pagedir_clear_page (owner->pagedir, upage); - size_t swap_slot = swap_out (kpage); - return true; + exec_file = owner->exec_file; + ASSERT (exec_file != NULL); + continue; } ASSERT (list_size (owners) == 1); @@ -112,6 +114,14 @@ page_insert_swapped (void *upage, void *kpage, struct list *owners) lock_release (&page->lock); } + if (exec_file != NULL) + { + lock_acquire (&shared_file_pages_lock); + struct shared_file_page *sfp = shared_file_page_get (exec_file, upage); + sfp->frame = NULL; + sfp->swap_slot = swap_out (kpage); + lock_release (&shared_file_pages_lock); + } return true; }