From: Paolo 'Blaisorblade' Giarrusso <[EMAIL PROTECTED]>

Since we probably will not support linear nonuniform VMAs, this will not
probably be needed. However I'm sending it just in case.

Fix try_to_unmap_one for linear VM_NONUNIFORM vma's.

When unmapping linear but non uniform VMA's in try_to_unmap_one, we must
encode the prots in the PTE.

However, we don't use the generic save_nonlinear_pte() function as it allows
for nonlinear offsets, on which we instead BUG() in this code path, by using
save_nonuniform_pte().

I've not added any TLB flush because PTE's have already been cleared and
flushed in both cases, and (I assume from existing practice and common sense,
but I don't trust CPU architects on having the latter ;-) ) TLB won't need to
know about changes in the "software" part of absent PTEs.

Signed-off-by: Paolo 'Blaisorblade' Giarrusso <[EMAIL PROTECTED]>
---

 linux-2.6.git-paolo/include/linux/pagemap.h |   11 +++++++++++
 linux-2.6.git-paolo/mm/rmap.c               |    3 +++
 2 files changed, 14 insertions(+)

diff -puN include/linux/pagemap.h~rfp-linear-nonuniform-1 
include/linux/pagemap.h
--- linux-2.6.git/include/linux/pagemap.h~rfp-linear-nonuniform-1       
2005-08-25 12:46:20.000000000 +0200
+++ linux-2.6.git-paolo/include/linux/pagemap.h 2005-08-25 12:46:20.000000000 
+0200
@@ -180,6 +180,17 @@ static inline void save_nonlinear_pte(pt
                set_pte_at(mm, addr, ptep, pgoff_prot_to_pte(page->index, 
pgprot));
 }
 
+/* For linear but nonuniform VMA's*/
+static inline void save_nonuniform_pte(pte_t pte, pte_t * ptep, struct
+               vm_area_struct *vma, struct mm_struct *mm, struct page* page,
+               unsigned long addr)
+{
+       pgprot_t pgprot = pte_to_pgprot(pte);
+       BUG_ON(linear_page_index(vma, addr) != page->index);
+       if (pgprot_val(pgprot) != pgprot_val(vma->vm_page_prot))
+               set_pte_at(mm, addr, ptep, pgoff_prot_to_pte(page->index, 
pgprot));
+}
+
 extern void FASTCALL(__lock_page(struct page *page));
 extern void FASTCALL(unlock_page(struct page *page));
 
diff -puN mm/rmap.c~rfp-linear-nonuniform-1 mm/rmap.c
--- linux-2.6.git/mm/rmap.c~rfp-linear-nonuniform-1     2005-08-25 
12:46:20.000000000 +0200
+++ linux-2.6.git-paolo/mm/rmap.c       2005-08-25 12:46:20.000000000 +0200
@@ -543,6 +543,9 @@ static int try_to_unmap_one(struct page 
        flush_cache_page(vma, address, page_to_pfn(page));
        pteval = ptep_clear_flush(vma, address, pte);
 
+       /* If nonlinear, store the file page offset in the pte. */
+       save_nonuniform_pte(pteval, pte, vma, mm, page, address);
+
        /* Move the dirty bit to the physical page now the pte is gone. */
        if (pte_dirty(pteval))
                set_page_dirty(page);
_
-
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to [EMAIL PROTECTED]
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/

Reply via email to