[patch 5/6] mm: remap ZERO_PAGE mappings

2005-07-26 Thread Nick Piggin

5/6

Remap ZERO_PAGE ptes when remapping memory. This is currently just an
optimisation for MIPS, which is the only architecture with multiple
zero pages - it now retains the mapping it needs for good cache performance,
and as well do_wp_page is now able to always correctly detect and
optimise zero page COW faults.

This change is required in order to be able to detect whether a pte
points to a ZERO_PAGE using only its (pte, vaddr) pair.

Signed-off-by: Nick Piggin <[EMAIL PROTECTED]>

Index: linux-2.6/mm/mremap.c
===
--- linux-2.6.orig/mm/mremap.c
+++ linux-2.6/mm/mremap.c
@@ -141,6 +141,10 @@ move_one_page(struct vm_area_struct *vma
if (dst) {
pte_t pte;
pte = ptep_clear_flush(vma, old_addr, src);
+   /* ZERO_PAGE can be dependant on virtual addr */
+   if (pfn_valid(pte_pfn(pte)) &&
+   pte_page(pte) == ZERO_PAGE(old_addr))
+   pte = 
pte_wrprotect(mk_pte(ZERO_PAGE(new_addr), new_vma->vm_page_prot));
set_pte_at(mm, new_addr, dst, pte);
} else
error = -ENOMEM;


[patch 5/6] mm: remap ZERO_PAGE mappings

2005-07-26 Thread Nick Piggin

5/6

Remap ZERO_PAGE ptes when remapping memory. This is currently just an
optimisation for MIPS, which is the only architecture with multiple
zero pages - it now retains the mapping it needs for good cache performance,
and as well do_wp_page is now able to always correctly detect and
optimise zero page COW faults.

This change is required in order to be able to detect whether a pte
points to a ZERO_PAGE using only its (pte, vaddr) pair.

Signed-off-by: Nick Piggin [EMAIL PROTECTED]

Index: linux-2.6/mm/mremap.c
===
--- linux-2.6.orig/mm/mremap.c
+++ linux-2.6/mm/mremap.c
@@ -141,6 +141,10 @@ move_one_page(struct vm_area_struct *vma
if (dst) {
pte_t pte;
pte = ptep_clear_flush(vma, old_addr, src);
+   /* ZERO_PAGE can be dependant on virtual addr */
+   if (pfn_valid(pte_pfn(pte)) 
+   pte_page(pte) == ZERO_PAGE(old_addr))
+   pte = 
pte_wrprotect(mk_pte(ZERO_PAGE(new_addr), new_vma-vm_page_prot));
set_pte_at(mm, new_addr, dst, pte);
} else
error = -ENOMEM;