diff -prauN pgcl-2.6.0-test5-bk3-7/arch/i386/mm/fault.c pgcl-2.6.0-test5-bk3-8/arch/i386/mm/fault.c --- pgcl-2.6.0-test5-bk3-7/arch/i386/mm/fault.c 2003-11-18 05:30:34.000000000 -0800 +++ pgcl-2.6.0-test5-bk3-8/arch/i386/mm/fault.c 2003-11-24 18:51:05.000000000 -0800 @@ -261,7 +261,16 @@ bad_area: continue; pte = pte_offset_map(pmd, addr); - if (pte_none(*pte) || !pte_present(*pte) || + if (pte_none(*pte)) { + pte_unmap(pte); + continue; + } + + printk("pte for 0x%lx = 0x%Lx\n", + addr, + (u64)pte_val(*pte)); + + if (!pte_present(*pte) || !pfn_valid(pte_pfn(*pte))) { pte_unmap(pte); continue; diff -prauN pgcl-2.6.0-test5-bk3-7/include/linux/folio.h pgcl-2.6.0-test5-bk3-8/include/linux/folio.h --- pgcl-2.6.0-test5-bk3-7/include/linux/folio.h 2003-11-20 10:47:07.000000000 -0800 +++ pgcl-2.6.0-test5-bk3-8/include/linux/folio.h 2003-11-24 21:19:57.000000000 -0800 @@ -494,7 +494,7 @@ static /* inline */ unsigned long set_fo continue; old_pte = *folio[j]; set_pte(folio[j], - pfn_pte(pfn + j, __pgprot(prot.pgprot | flags))); + pfn_pte(pfn + j, __pgprot(pgprot_val(prot) | flags))); pr_debug("%d: translating vaddr 0x%lx to pfn 0x%lx, " "new pte = 0x%Lx, old pte = 0x%Lx\n", current->pid, diff -prauN pgcl-2.6.0-test5-bk3-7/mm/memory.c pgcl-2.6.0-test5-bk3-8/mm/memory.c --- pgcl-2.6.0-test5-bk3-7/mm/memory.c 2003-11-20 09:57:42.000000000 -0800 +++ pgcl-2.6.0-test5-bk3-8/mm/memory.c 2003-11-24 20:39:15.000000000 -0800 @@ -1046,8 +1046,6 @@ static int do_wp_page(struct mm_struct * reprep = prepare_folio(folio, vma, address, ptep_to_paddr(page_table), 1); new_page = private_folio_page(folio, PAGE_MMUSHIFT ? NULL : old_page); - if (!PageReserved(old_page)) - page_cache_get(old_page); if (new_page) { pr_debug("%d: got private page\n", current->pid); page_cache_get(new_page); @@ -1058,20 +1056,15 @@ static int do_wp_page(struct mm_struct * spin_unlock(&mm->page_table_lock); pte_chain = pte_chain_alloc(GFP_KERNEL); - if (!pte_chain) { - if (!PageReserved(old_page)) - page_cache_release(old_page); + if (!pte_chain) goto oom; - } + new_page = alloc_page(GFP_HIGHUSER); pr_debug("%d: allocated page at 0x%lx\n", current->pid, page_to_pfn(new_page)); - if (!new_page) { - if (!PageReserved(old_page)) - page_cache_release(old_page); + if (!new_page) goto oom; - } /* * Re-check the pte - we dropped the lock @@ -1104,7 +1097,7 @@ got_page: if (PageReserved(old_page)) mm->rss += rss; else - adjust_page_count(old_page, -rss); + adjust_page_count(old_page, 1 - rss); } pte_unmap(page_table); flush_folio(folio, vma, address);