fix: only swap out shared pages once

This commit is contained in:
2024-12-05 22:37:14 +00:00
parent 9aa9cdb91e
commit 833c1b0520

View File

@@ -71,17 +71,19 @@ static void page_set_swap (struct thread *owner, uint32_t *pte,
bool bool
page_insert_swapped (void *upage, void *kpage, struct list *owners) page_insert_swapped (void *upage, void *kpage, struct list *owners)
{ {
struct file *exec_file = NULL;
struct list_elem *e; struct list_elem *e;
for (e = list_begin (owners); e != list_end (owners); e = list_next (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; struct thread *owner = list_entry (e, struct frame_owner, elem)->owner;
uint32_t *pte = lookup_page (owner->pagedir, upage, false); 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); pagedir_clear_page (owner->pagedir, upage);
size_t swap_slot = swap_out (kpage); exec_file = owner->exec_file;
return true; ASSERT (exec_file != NULL);
continue;
} }
ASSERT (list_size (owners) == 1); ASSERT (list_size (owners) == 1);
@@ -112,6 +114,14 @@ page_insert_swapped (void *upage, void *kpage, struct list *owners)
lock_release (&page->lock); 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; return true;
} }