From 0084d12fb1924237b95fa0af3c87aab248877c80 Mon Sep 17 00:00:00 2001 From: Themis Demetriades Date: Fri, 6 Dec 2024 17:30:46 +0000 Subject: [PATCH] fix: synchronise destruction of page directories with frame table --- src/userprog/pagedir.c | 3 +++ src/vm/frame.c | 11 +++++++++-- 2 files changed, 12 insertions(+), 2 deletions(-) diff --git a/src/userprog/pagedir.c b/src/userprog/pagedir.c index 1d79b38..f12f0ce 100644 --- a/src/userprog/pagedir.c +++ b/src/userprog/pagedir.c @@ -6,6 +6,7 @@ #include "threads/init.h" #include "threads/pte.h" #include "threads/palloc.h" +#include "threads/synch.h" #include "vm/frame.h" #include "vm/page.h" @@ -35,6 +36,7 @@ pagedir_destroy (uint32_t *pd) return; ASSERT (pd != init_page_dir); + lock_acquire (&lru_lock); for (pde = pd; pde < pd + pd_no (PHYS_BASE); pde++) if (*pde & PTE_P) { @@ -53,6 +55,7 @@ pagedir_destroy (uint32_t *pd) palloc_free_page (pt); } palloc_free_page (pd); + lock_release (&lru_lock); } /* Returns the address of the page table entry for virtual diff --git a/src/vm/frame.c b/src/vm/frame.c index c1d5ae3..a9028f1 100644 --- a/src/vm/frame.c +++ b/src/vm/frame.c @@ -209,8 +209,13 @@ frame_free (void *frame) "but this address is not allocated!\n", frame); + bool lock_held = lock_held_by_current_thread (&lru_lock); + free_owners (&frame_metadata->owners); - lock_acquire (&lru_lock); + + if (!lock_held) + lock_acquire (&lru_lock); + hash_delete (&frame_table, &frame_metadata->hash_elem); list_remove (&frame_metadata->list_elem); @@ -224,7 +229,9 @@ frame_free (void *frame) else next_victim = lru_next (next_victim); } - lock_release (&lru_lock); + + if (!lock_held) + lock_release (&lru_lock); free (frame_metadata); palloc_free_page (frame);