Index: linux-2.6/mm/memory.c =================================================================== --- linux-2.6.orig/mm/memory.c +++ linux-2.6/mm/memory.c @@ -665,7 +665,8 @@ static unsigned long zap_pte_range(struc ptent = ptep_get_and_clear_full(mm, addr, pte, tlb->fullmm); tlb_remove_tlb_entry(tlb, pte, addr); - if (unlikely(!page)) + if (unlikely(!page || + (!vma->vm_file && page == ZERO_PAGE(addr)))) continue; if (unlikely(details) && details->nonlinear_vma && linear_page_index(details->nonlinear_vma, @@ -2152,15 +2153,12 @@ static int do_anonymous_page(struct mm_s } else { /* Map the ZERO_PAGE - vm_page_prot is readonly */ page = ZERO_PAGE(address); - page_cache_get(page); entry = mk_pte(page, vma->vm_page_prot); ptl = pte_lockptr(mm, pmd); spin_lock(ptl); if (!pte_none(*page_table)) - goto release; - inc_mm_counter(mm, file_rss); - page_add_file_rmap(page); + goto unlock; } set_pte_at(mm, address, page_table, entry);