From 77fedd6666e99e53d2964e69aa7d48771cd2e2e1 Mon Sep 17 00:00:00 2001 From: Gleb Koval Date: Fri, 6 Dec 2024 17:31:33 +0000 Subject: [PATCH] fix: synchronise threads' SPTs with locks --- src/threads/thread.c | 2 ++ src/threads/thread.h | 1 + src/userprog/process.c | 2 ++ src/vm/page.c | 9 ++++++++- 4 files changed, 13 insertions(+), 1 deletion(-) diff --git a/src/threads/thread.c b/src/threads/thread.c index 5af7da3..92bb940 100644 --- a/src/threads/thread.c +++ b/src/threads/thread.c @@ -736,6 +736,8 @@ init_thread (struct thread *t, const char *name, int nice, int priority, t->recent_cpu = recent_cpu; t->priority = t->base_priority; + lock_init (&t->pages_lock); + old_level = intr_disable (); list_push_back (&all_list, &t->allelem); intr_set_level (old_level); diff --git a/src/threads/thread.h b/src/threads/thread.h index fe7f362..ca461cd 100644 --- a/src/threads/thread.h +++ b/src/threads/thread.h @@ -136,6 +136,7 @@ struct thread struct list_elem elem; /* List element. */ struct hash pages; /* Table of open user pages. */ + struct lock pages_lock; /* Lock for the supplementary page table. */ /* Memory mapped files for user virtual memory. */ struct hash mmap_files; /* List of memory mapped files. */ diff --git a/src/userprog/process.c b/src/userprog/process.c index 9024540..8fa2d27 100644 --- a/src/userprog/process.c +++ b/src/userprog/process.c @@ -371,7 +371,9 @@ process_exit (void) hash_destroy (&cur->open_files, fd_cleanup); /* Clean up the thread's supplemental page table. */ + lock_acquire (&cur->pages_lock); hash_destroy (&cur->pages, page_cleanup); + lock_release (&cur->pages_lock); /* Close the executable file, implicitly allowing it to be written to. */ if (cur->exec_file != NULL) diff --git a/src/vm/page.c b/src/vm/page.c index cea753a..487103d 100644 --- a/src/vm/page.c +++ b/src/vm/page.c @@ -90,6 +90,7 @@ page_insert_swapped (void *upage, void *kpage, struct list *owners) /* 1. Initialize swapped page entry. */ struct page_entry *page = page_get (owner, upage); + lock_acquire (&owner->pages_lock); if (page == NULL) { page = malloc (sizeof (struct page_entry)); @@ -113,6 +114,7 @@ page_insert_swapped (void *upage, void *kpage, struct list *owners) page_set_swap (owner, pte, swap_slot); lock_release (&page->lock); + lock_release (&owner->pages_lock); } if (exec_file != NULL) { @@ -155,7 +157,10 @@ page_insert_file (struct file *file, off_t ofs, void *upage, page->writable = writable; lock_init (&page->lock); - hash_insert (&thread_current ()->pages, &page->elem); + struct thread *t = thread_current (); + lock_acquire (&t->pages_lock); + hash_insert (&t->pages, &page->elem); + lock_release (&t->pages_lock); return page; } @@ -167,8 +172,10 @@ page_get (struct thread *thread, void *upage) struct page_entry fake_page_entry; fake_page_entry.upage = upage; + lock_acquire (&thread->pages_lock); struct hash_elem *e = hash_find (&thread->pages, &fake_page_entry.elem); + lock_release (&thread->pages_lock); if (e == NULL) return NULL; -- 2.49.1