From cea4fd777767549f16d954d7dc6d533ee7bd163d Mon Sep 17 00:00:00 2001 From: Yingdi Shan Date: Fri, 7 Jun 2024 13:55:18 +0800 Subject: [PATCH] Fix the concurrency bug when multiple threads committing the same page --- kernel/aster-nix/src/fs/utils/page_cache.rs | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/kernel/aster-nix/src/fs/utils/page_cache.rs b/kernel/aster-nix/src/fs/utils/page_cache.rs index 9201acbef..d741ed057 100644 --- a/kernel/aster-nix/src/fs/utils/page_cache.rs +++ b/kernel/aster-nix/src/fs/utils/page_cache.rs @@ -156,7 +156,7 @@ impl Pager for PageCacheManager { return Ok(page.frame.clone()); } - //Multiple threads may commit the same page, but the result is ok. + // Multiple threads may commit the same page, but the result is ok. let backend = self.backend(); let page = if idx < backend.npages() { let mut page = Page::alloc()?; @@ -167,9 +167,9 @@ impl Pager for PageCacheManager { } else { Page::alloc_zero()? }; - let frame = page.frame().clone(); - self.pages.lock().put(idx, page); - Ok(frame) + + // If multiple threads commit the same page, only the first allocated page will be perserved. + Ok(self.pages.lock().get_or_insert(idx, || page).frame.clone()) } fn update_page(&self, idx: usize) -> Result<()> {