Преглед изворни кода

修复do_cow_page死锁问题

MemoryShore пре 8 месеци
родитељ
комит
e13cf395cb
1 измењених фајлова са 13 додато и 13 уклоњено
  1. 13 13
      kernel/src/mm/fault.rs

+ 13 - 13
kernel/src/mm/fault.rs

@@ -294,6 +294,17 @@ impl PageFaultHandler {
     /// ## 返回值
     /// - VmFaultReason: 页面错误处理信息标志
     pub unsafe fn do_cow_fault(pfm: &mut PageFaultMessage) -> VmFaultReason {
+        let mut ret = Self::filemap_fault(pfm);
+
+        if unlikely(ret.intersects(
+            VmFaultReason::VM_FAULT_ERROR
+                | VmFaultReason::VM_FAULT_NOPAGE
+                | VmFaultReason::VM_FAULT_RETRY
+                | VmFaultReason::VM_FAULT_DONE_COW,
+        )) {
+            return ret;
+        }
+
         let cache_page = pfm.page.clone().unwrap();
         let mapper = &mut pfm.mapper;
 
@@ -306,17 +317,6 @@ impl PageFaultHandler {
         let cow_page = Arc::new(Page::new(false, cow_page_phys));
         pfm.cow_page = Some(cow_page.clone());
 
-        let mut ret = Self::filemap_fault(pfm);
-
-        if unlikely(ret.intersects(
-            VmFaultReason::VM_FAULT_ERROR
-                | VmFaultReason::VM_FAULT_NOPAGE
-                | VmFaultReason::VM_FAULT_RETRY
-                | VmFaultReason::VM_FAULT_DONE_COW,
-        )) {
-            return ret;
-        }
-
         //复制PageCache内容到新的页内
         let new_frame = MMArch::phys_2_virt(cow_page_phys).unwrap();
         (new_frame.data() as *mut u8).copy_from_nonoverlapping(
@@ -331,8 +331,8 @@ impl PageFaultHandler {
         // 新页加入页管理器中
         page_manager_guard.insert(cow_page_phys, &cow_page);
         cow_page.write_irqsave().set_page_cache_index(
-            cow_page.read_irqsave().page_cache(),
-            cow_page.read_irqsave().index(),
+            cache_page.read_irqsave().page_cache(),
+            cache_page.read_irqsave().index(),
         );
 
         // 将vma插入页的vma表中