Explorar o código

fix(mm):优化extract中对before和after VMA映射情况的判断 (#802) (#803)

Jomo hai 1 ano
pai
achega
740c6ffea7
Modificáronse 1 ficheiros con 18 adicións e 12 borrados
  1. 18 12
      kernel/src/mm/ucontext.rs

+ 18 - 12
kernel/src/mm/ucontext.rs

@@ -1132,22 +1132,28 @@ impl LockedVMA {
         // 重新设置before、after这两个VMA里面的物理页的anon_vma
         let mut page_manager_guard = page_manager_lock_irqsave();
         if let Some(before) = before.clone() {
-            let virt_iter = before.lock().region.iter_pages();
-            for frame in virt_iter {
-                let paddr = utable.translate(frame.virt_address()).unwrap().0;
-                let page = page_manager_guard.get_mut(&paddr);
-                page.insert_vma(before.clone());
-                page.remove_vma(self);
+            let before_guard = before.lock();
+            if before_guard.mapped {
+                let virt_iter = before_guard.region.iter_pages();
+                for frame in virt_iter {
+                    let paddr = utable.translate(frame.virt_address()).unwrap().0;
+                    let page = page_manager_guard.get_mut(&paddr);
+                    page.insert_vma(before.clone());
+                    page.remove_vma(self);
+                }
             }
         }
 
         if let Some(after) = after.clone() {
-            let virt_iter = after.lock().region.iter_pages();
-            for frame in virt_iter {
-                let paddr = utable.translate(frame.virt_address()).unwrap().0;
-                let page = page_manager_guard.get_mut(&paddr);
-                page.insert_vma(after.clone());
-                page.remove_vma(self);
+            let after_guard = after.lock();
+            if after_guard.mapped {
+                let virt_iter = after_guard.region.iter_pages();
+                for frame in virt_iter {
+                    let paddr = utable.translate(frame.virt_address()).unwrap().0;
+                    let page = page_manager_guard.get_mut(&paddr);
+                    page.insert_vma(after.clone());
+                    page.remove_vma(self);
+                }
             }
         }