Commit:     b868868ae0f7272228c95cc760338ffe35bb739d
Parent:     01e9943c79ad4edb2c0b76c99029e34d704223ce
Author:     Ralf Baechle <[EMAIL PROTECTED]>
AuthorDate: Tue Sep 11 18:05:33 2007 +0100
Committer:  Ralf Baechle <[EMAIL PROTECTED]>
CommitDate: Tue Sep 11 19:03:26 2007 +0100

    [MIPS] Fix aliasing bug in copy_user_highpage.
    Copy_user_highpage was written assuming it was only being called for
    breaking COW pages in which case the source page isn't cached as in
    marked cachable under it kernel virtual address.  If it is called anyway
    the aliasing avoidance strategy implemented by kmap_coherent will fail.
    Avoid the use of kmap_coherent for pages marked dirty and to avoid
    another instance of this sort of bug, place a BUG_ON in kmap_coherent.
    Signed-off-by: Ralf Baechle <[EMAIL PROTECTED]>
 arch/mips/mm/init.c |    5 ++++-
 1 files changed, 4 insertions(+), 1 deletions(-)

diff --git a/arch/mips/mm/init.c b/arch/mips/mm/init.c
index 09d9150..5240432 100644
--- a/arch/mips/mm/init.c
+++ b/arch/mips/mm/init.c
@@ -8,6 +8,7 @@
  * Kevin D. Kissell, [EMAIL PROTECTED] and Carsten Langgaard, [EMAIL PROTECTED]
  * Copyright (C) 2000 MIPS Technologies, Inc.  All rights reserved.
+#include <linux/bug.h>
 #include <linux/init.h>
 #include <linux/module.h>
 #include <linux/signal.h>
@@ -132,6 +133,8 @@ void *kmap_coherent(struct page *page, unsigned long addr)
        pte_t pte;
        int tlbidx;
+       BUG_ON(Page_dcache_dirty(page));
        idx = (addr >> PAGE_SHIFT) & (FIX_N_COLOURS - 1);
@@ -208,7 +211,7 @@ void copy_user_highpage(struct page *to, struct page *from,
        void *vfrom, *vto;
        vto = kmap_atomic(to, KM_USER1);
-       if (cpu_has_dc_aliases) {
+       if (cpu_has_dc_aliases && !Page_dcache_dirty(from)) {
                vfrom = kmap_coherent(from, vaddr);
                copy_page(vto, vfrom);
To unsubscribe from this list: send the line "unsubscribe git-commits-head" in
the body of a message to [EMAIL PROTECTED]
More majordomo info at

Reply via email to