Combine every component of VM together #62
@@ -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;
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user