fix: only swap out shared pages once
This commit is contained in:
@@ -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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user