]> Pileus Git - ~andy/linux/commitdiff
ARC: [mm] Assume pagecache page dirty by default
authorVineet Gupta <vgupta@synopsys.com>
Mon, 13 May 2013 11:53:58 +0000 (17:23 +0530)
committerVineet Gupta <vgupta@synopsys.com>
Sat, 22 Jun 2013 13:53:19 +0000 (19:23 +0530)
Similar to ARM/SH

Signed-off-by: Vineet Gupta <vgupta@synopsys.com>
arch/arc/include/asm/cacheflush.h
arch/arc/mm/cache_arc700.c
arch/arc/mm/tlb.c

index 185dfd03dcdb815b73f80b7af0829e676cf62132..6abc4972bc93bbba015c3ebe92ea40926c7413a8 100644 (file)
@@ -80,6 +80,13 @@ void flush_anon_page(struct vm_area_struct *vma,
 
 #endif /* CONFIG_ARC_CACHE_VIPT_ALIASING */
 
+/*
+ * A new pagecache page has PG_arch_1 clear - thus dcache dirty by default
+ * This works around some PIO based drivers which don't call flush_dcache_page
+ * to record that they dirtied the dcache
+ */
+#define PG_dc_clean    PG_arch_1
+
 /*
  * Simple wrapper over config option
  * Bootup code ensures that hardware matches kernel configuration
index 074658704d8682199688cd4f1fcf1f0123cb5141..66c75ee16e503778e32292333bbeb5a2b9c91f48 100644 (file)
@@ -512,7 +512,7 @@ void flush_dcache_page(struct page *page)
        struct address_space *mapping;
 
        if (!cache_is_vipt_aliasing()) {
-               set_bit(PG_arch_1, &page->flags);
+               clear_bit(PG_dc_clean, &page->flags);
                return;
        }
 
@@ -526,7 +526,7 @@ void flush_dcache_page(struct page *page)
         * Make a note that K-mapping is dirty
         */
        if (!mapping_mapped(mapping)) {
-               set_bit(PG_arch_1, &page->flags);
+               clear_bit(PG_dc_clean, &page->flags);
        } else if (page_mapped(page)) {
 
                /* kernel reading from page with U-mapping */
@@ -734,7 +734,7 @@ void copy_user_highpage(struct page *to, struct page *from,
         * non copied user pages (e.g. read faults which wire in pagecache page
         * directly).
         */
-       set_bit(PG_arch_1, &to->flags);
+       clear_bit(PG_dc_clean, &to->flags);
 
        /*
         * if SRC was already usermapped and non-congruent to kernel mapping
@@ -742,16 +742,16 @@ void copy_user_highpage(struct page *to, struct page *from,
         */
        if (clean_src_k_mappings) {
                __flush_dcache_page(kfrom, kfrom);
-               clear_bit(PG_arch_1, &from->flags);
+               set_bit(PG_dc_clean, &from->flags);
        } else {
-               set_bit(PG_arch_1, &from->flags);
+               clear_bit(PG_dc_clean, &from->flags);
        }
 }
 
 void clear_user_page(void *to, unsigned long u_vaddr, struct page *page)
 {
        clear_page(to);
-       set_bit(PG_arch_1, &page->flags);
+       clear_bit(PG_dc_clean, &page->flags);
 }
 
 
index 1c91dbc8ddd86f4351d74eadb08916c3365b6fbe..d44ae33c2d1e61a4a432ee31ec2214a6668a8fc5 100644 (file)
@@ -453,7 +453,7 @@ void update_mmu_cache(struct vm_area_struct *vma, unsigned long vaddr_unaligned,
        if ((vma->vm_flags & VM_EXEC) ||
             addr_not_cache_congruent(paddr, vaddr)) {
 
-               int dirty = test_and_clear_bit(PG_arch_1, &page->flags);
+               int dirty = !test_and_set_bit(PG_dc_clean, &page->flags);
                if (dirty) {
                        /* wback + inv dcache lines */
                        __flush_dcache_page(paddr, paddr);