]> pilppa.org Git - linux-2.6-omap-h63xx.git/blobdiff - arch/mips/mm/init.c
Merge commit 'v2.6.26' into bkl-removal
[linux-2.6-omap-h63xx.git] / arch / mips / mm / init.c
index 480dec04f552cbe086f6fa96aedbaf73ff09ff7c..137c14bafd6b55932e793017f02bda315dea12b5 100644 (file)
@@ -71,6 +71,7 @@ DEFINE_PER_CPU(struct mmu_gather, mmu_gathers);
  * don't have to care about aliases on other CPUs.
  */
 unsigned long empty_zero_page, zero_page_mask;
+EXPORT_SYMBOL_GPL(empty_zero_page);
 
 /*
  * Not static inline because used by IP27 special magic initialization code
@@ -142,7 +143,7 @@ void *kmap_coherent(struct page *page, unsigned long addr)
 #endif
        vaddr = __fix_to_virt(FIX_CMAP_END - idx);
        pte = mk_pte(page, PAGE_KERNEL);
-#if defined(CONFIG_64BIT_PHYS_ADDR) && defined(CONFIG_CPU_MIPS32_R1)
+#if defined(CONFIG_64BIT_PHYS_ADDR) && defined(CONFIG_CPU_MIPS32)
        entrylo = pte.pte_high;
 #else
        entrylo = pte_val(pte) >> 6;
@@ -211,7 +212,8 @@ void copy_user_highpage(struct page *to, struct page *from,
        void *vfrom, *vto;
 
        vto = kmap_atomic(to, KM_USER1);
-       if (cpu_has_dc_aliases && page_mapped(from)) {
+       if (cpu_has_dc_aliases &&
+           page_mapped(from) && !Page_dcache_dirty(from)) {
                vfrom = kmap_coherent(from, vaddr);
                copy_page(vto, vfrom);
                kunmap_coherent();
@@ -220,7 +222,7 @@ void copy_user_highpage(struct page *to, struct page *from,
                copy_page(vto, vfrom);
                kunmap_atomic(vfrom, KM_USER0);
        }
-       if (((vma->vm_flags & VM_EXEC) && !cpu_has_ic_fills_f_dc) ||
+       if ((!cpu_has_ic_fills_f_dc) ||
            pages_do_alias((unsigned long)vto, vaddr & PAGE_MASK))
                flush_data_cache_page((unsigned long)vto);
        kunmap_atomic(vto, KM_USER1);
@@ -228,13 +230,12 @@ void copy_user_highpage(struct page *to, struct page *from,
        smp_wmb();
 }
 
-EXPORT_SYMBOL(copy_user_highpage);
-
 void copy_to_user_page(struct vm_area_struct *vma,
        struct page *page, unsigned long vaddr, void *dst, const void *src,
        unsigned long len)
 {
-       if (cpu_has_dc_aliases && page_mapped(page)) {
+       if (cpu_has_dc_aliases &&
+           page_mapped(page) && !Page_dcache_dirty(page)) {
                void *vto = kmap_coherent(page, vaddr) + (vaddr & ~PAGE_MASK);
                memcpy(vto, src, len);
                kunmap_coherent();
@@ -247,13 +248,12 @@ void copy_to_user_page(struct vm_area_struct *vma,
                flush_cache_page(vma, vaddr, page_to_pfn(page));
 }
 
-EXPORT_SYMBOL(copy_to_user_page);
-
 void copy_from_user_page(struct vm_area_struct *vma,
        struct page *page, unsigned long vaddr, void *dst, const void *src,
        unsigned long len)
 {
-       if (cpu_has_dc_aliases && page_mapped(page)) {
+       if (cpu_has_dc_aliases &&
+           page_mapped(page) && !Page_dcache_dirty(page)) {
                void *vfrom = kmap_coherent(page, vaddr) + (vaddr & ~PAGE_MASK);
                memcpy(dst, vfrom, len);
                kunmap_coherent();
@@ -264,9 +264,6 @@ void copy_from_user_page(struct vm_area_struct *vma,
        }
 }
 
-EXPORT_SYMBOL(copy_from_user_page);
-
-
 #ifdef CONFIG_HIGHMEM
 unsigned long highstart_pfn, highend_pfn;