From 052e18485d19f26d4182a662054369926d0c4dd0 Mon Sep 17 00:00:00 2001
From: Austin Clements <amdragon@mit.edu>
Date: Thu, 1 Sep 2011 21:29:09 -0400
Subject: [PATCH] Skip missing page directories in deallocuvm

Previously, deallocuvm scanned from 0 to KERNBASE in one page
increments, which had a noticable effect on boot time.  Now it skips
over missing page directories.
---
 vm.c | 4 +++-
 1 file changed, 3 insertions(+), 1 deletion(-)

diff --git a/vm.c b/vm.c
index c717baf..181b376 100644
--- a/vm.c
+++ b/vm.c
@@ -261,7 +261,9 @@ deallocuvm(pde_t *pgdir, uint oldsz, uint newsz)
   a = PGROUNDUP(newsz);
   for(; a  < oldsz; a += PGSIZE){
     pte = walkpgdir(pgdir, (char*)a, 0);
-    if(pte && (*pte & PTE_P) != 0){
+    if(!pte)
+      a += (NPTENTRIES - 1) * PGSIZE;
+    else if((*pte & PTE_P) != 0){
       pa = PTE_ADDR(*pte);
       if(pa == 0)
         panic("kfree");
-- 
GitLab