From a34bbbed0862460473f33f8c3c7b70b9edab269f Mon Sep 17 00:00:00 2001 From: sBubshait Date: Thu, 5 Dec 2024 22:53:48 +0000 Subject: [PATCH] Update frame: When evicting an mmapped file page, write it back to the file if it is dirty --- src/vm/frame.c | 24 +++++++++++++++++++++--- 1 file changed, 21 insertions(+), 3 deletions(-) diff --git a/src/vm/frame.c b/src/vm/frame.c index 2c57d53..8a1a36f 100644 --- a/src/vm/frame.c +++ b/src/vm/frame.c @@ -2,12 +2,13 @@ #include #include #include - #include "frame.h" #include "page.h" +#include "filesys/file.h" #include "threads/malloc.h" #include "threads/vaddr.h" #include "userprog/pagedir.h" +#include "userprog/syscall.h" #include "threads/synch.h" /* Hash table that maps every active frame's kernel virtual address @@ -91,8 +92,25 @@ frame_alloc (enum palloc_flags flags, void *upage, struct thread *owner) struct frame_metadata *victim = get_victim (); ASSERT (victim != NULL); /* get_victim () should never return null. */ - /* 2. Swap out victim into disk. */ - page_insert_swapped (victim->upage, victim->frame, victim->owner); + /* 2. Handle victim page writing based on its type. */ + struct page_entry *victim_page = page_get (victim->upage); + if (victim_page != NULL && victim_page->type == PAGE_MMAP) + { + /* If it was a memory-mapped file page, we just write it back + to the file if it was dirty. */ + if (pagedir_is_dirty(owner->pagedir, victim->upage)) + { + lock_acquire (&filesys_lock); + file_write_at (victim_page->file, victim->upage, + victim_page->read_bytes, victim_page->offset); + lock_release (&filesys_lock); + } + + } + else + /* Otherwise, insert the page into swap. */ + page_insert_swapped (victim->upage, victim->frame, victim->owner); + /* If zero flag is set, zero out the victim page. */ if (flags & PAL_ZERO)