sh: update_mmu_cache() consolidation.
authorPaul Mundt <lethal@linux-sh.org>
Tue, 28 Jul 2009 15:12:17 +0000 (00:12 +0900)
committerPaul Mundt <lethal@linux-sh.org>
Tue, 28 Jul 2009 15:12:17 +0000 (00:12 +0900)
This splits out a separate __update_cache()/__update_tlb() for
update_mmu_cache() to wrap in to. This lets us share the common
__update_cache() bits while keeping special __update_tlb() handling
broken out.

Signed-off-by: Paul Mundt <lethal@linux-sh.org>
arch/sh/include/asm/pgtable.h
arch/sh/mm/pg-mmu.c
arch/sh/mm/tlb-nommu.c
arch/sh/mm/tlb-pteaex.c
arch/sh/mm/tlb-sh3.c
arch/sh/mm/tlb-sh4.c
arch/sh/mm/tlbflush_64.c

index ba2333216c5b6fa75255de71b1ae2748dbd2a193..43ef3e99fdd1d692dc5fdfa4ece91d1ae43ec0be 100644 (file)
@@ -134,8 +134,19 @@ typedef pte_t *pte_addr_t;
 #define pgtable_cache_init()   do { } while (0)
 
 struct vm_area_struct;
-extern void update_mmu_cache(struct vm_area_struct * vma,
-                            unsigned long address, pte_t pte);
+
+extern void __update_cache(struct vm_area_struct *vma,
+                          unsigned long address, pte_t pte);
+extern void __update_tlb(struct vm_area_struct *vma,
+                        unsigned long address, pte_t pte);
+
+static inline void
+update_mmu_cache(struct vm_area_struct *vma, unsigned long address, pte_t pte)
+{
+       __update_cache(vma, address, pte);
+       __update_tlb(vma, address, pte);
+}
+
 extern pgd_t swapper_pg_dir[PTRS_PER_PGD];
 extern void paging_init(void);
 extern void page_table_range_init(unsigned long start, unsigned long end,
index 356d2cdcb209b6662807c842fd67310ae66df48e..8602f68af4c869748951ccbd1109f2cf78833ba0 100644 (file)
@@ -134,3 +134,24 @@ void clear_user_highpage(struct page *page, unsigned long vaddr)
        kunmap_atomic(kaddr, KM_USER0);
 }
 EXPORT_SYMBOL(clear_user_highpage);
+
+void __update_cache(struct vm_area_struct *vma,
+                   unsigned long address, pte_t pte)
+{
+       struct page *page;
+       unsigned long pfn = pte_pfn(pte);
+
+       if (!boot_cpu_data.dcache.n_aliases)
+               return;
+
+       page = pfn_to_page(pfn);
+       if (pfn_valid(pfn) && page_mapping(page)) {
+               int dirty = test_and_clear_bit(PG_dcache_dirty, &page->flags);
+               if (dirty) {
+                       unsigned long addr = (unsigned long)page_address(page);
+
+                       if (pages_do_alias(addr, address & PAGE_MASK))
+                               __flush_wback_region((void *)addr, PAGE_SIZE);
+               }
+       }
+}
index 71c742b5aee313b4badeaa62ac8610086fad2522..0ef5429943dfe646858cf590a00de59255f8dcfd 100644 (file)
@@ -46,10 +46,13 @@ void local_flush_tlb_kernel_range(unsigned long start, unsigned long end)
        BUG();
 }
 
-void update_mmu_cache(struct vm_area_struct * vma,
-                     unsigned long address, pte_t pte)
+void __update_tlb(struct vm_area_struct *vma, unsigned long address, pte_t pte)
+{
+}
+
+void __update_cache(struct vm_area_struct *vma,
+                   unsigned long address, pte_t pte)
 {
-       BUG();
 }
 
 void __init page_table_range_init(unsigned long start, unsigned long end,
index c39b7736335226e70fa1710c5607ded0caf8d99c..9aabd313cededbae5f256b0fa13ce8c7a3a79f7f 100644 (file)
 #include <asm/mmu_context.h>
 #include <asm/cacheflush.h>
 
-void update_mmu_cache(struct vm_area_struct * vma,
-                     unsigned long address, pte_t pte)
+void __update_tlb(struct vm_area_struct *vma, unsigned long address, pte_t pte)
 {
-       unsigned long flags;
-       unsigned long pteval;
-       unsigned long vpn;
+       unsigned long flags, pteval, vpn;
 
-       /* Ptrace may call this routine. */
-       if (vma && current->active_mm != vma->vm_mm)
+       /*
+        * Handle debugger faulting in for debugee.
+        */
+       if (current->active_mm != vma->vm_mm)
                return;
 
        local_irq_save(flags);
index 9b8459c74abd2000d70105e06150cd8744af6d29..425f1f23cf9371f333d810bdb1801e1f2e1b52d0 100644 (file)
 #include <asm/mmu_context.h>
 #include <asm/cacheflush.h>
 
-void update_mmu_cache(struct vm_area_struct * vma,
-                     unsigned long address, pte_t pte)
+void __update_tlb(struct vm_area_struct *vma, unsigned long address, pte_t pte)
 {
-       unsigned long flags;
-       unsigned long pteval;
-       unsigned long vpn;
-       unsigned long pfn = pte_pfn(pte);
-       struct page *page;
+       unsigned long flags, pteval, vpn;
 
-       /* Ptrace may call this routine. */
-       if (vma && current->active_mm != vma->vm_mm)
+       /*
+        * Handle debugger faulting in for debugee.
+        */
+       if (current->active_mm != vma->vm_mm)
                return;
 
-       page = pfn_to_page(pfn);
-       if (pfn_valid(pfn) && page_mapping(page)) {
-#if defined(CONFIG_SH7705_CACHE_32KB)
-               int dirty = test_and_clear_bit(PG_dcache_dirty, &page->flags);
-               if (dirty) {
-                       unsigned long addr = (unsigned long)page_address(page);
-
-                       if (pages_do_alias(addr, address & PAGE_MASK))
-                               __flush_wback_region((void *)addr, PAGE_SIZE);
-               }
-#endif
-       }
-
        local_irq_save(flags);
 
        /* Set PTEH register */
@@ -93,4 +77,3 @@ void local_flush_tlb_one(unsigned long asid, unsigned long page)
        for (i = 0; i < ways; i++)
                ctrl_outl(data, addr + (i << 8));
 }
-
index cf50082d2435092433a8ec0a64e4090310c84e12..81199f1e594517f3721fb96f5ae9b0c74a8f4dd9 100644 (file)
 #include <asm/mmu_context.h>
 #include <asm/cacheflush.h>
 
-void update_mmu_cache(struct vm_area_struct * vma,
-                     unsigned long address, pte_t pte)
+void __update_tlb(struct vm_area_struct *vma, unsigned long address, pte_t pte)
 {
-       unsigned long flags;
-       unsigned long pteval;
-       unsigned long vpn;
-       unsigned long pfn = pte_pfn(pte);
-       struct page *page;
+       unsigned long flags, pteval, vpn;
 
-       /* Ptrace may call this routine. */
-       if (vma && current->active_mm != vma->vm_mm)
+       /*
+        * Handle debugger faulting in for debugee.
+        */
+       if (current->active_mm != vma->vm_mm)
                return;
 
-       page = pfn_to_page(pfn);
-       if (pfn_valid(pfn) && page_mapping(page)) {
-#ifndef CONFIG_SMP
-               int dirty = test_and_clear_bit(PG_dcache_dirty, &page->flags);
-               if (dirty) {
-
-                       unsigned long addr = (unsigned long)page_address(page);
-
-                       if (pages_do_alias(addr, address & PAGE_MASK))
-                               __flush_wback_region((void *)addr, PAGE_SIZE);
-               }
-#endif
-       }
-
        local_irq_save(flags);
 
        /* Set PTEH register */
index 3ce40ea34824914f6ad30ad2abb38a0d8ca9d401..f2e44e9ffb7578052ada53b61561c4affa8110d8 100644 (file)
@@ -329,22 +329,6 @@ do_sigbus:
                goto no_context;
 }
 
-void update_mmu_cache(struct vm_area_struct * vma,
-                       unsigned long address, pte_t pte)
-{
-       /*
-        * This appears to get called once for every pte entry that gets
-        * established => I don't think it's efficient to try refilling the
-        * TLBs with the pages - some may not get accessed even.  Also, for
-        * executable pages, it is impossible to determine reliably here which
-        * TLB they should be mapped into (or both even).
-        *
-        * So, just do nothing here and handle faults on demand.  In the
-        * TLBMISS handling case, the refill is now done anyway after the pte
-        * has been fixed up, so that deals with most useful cases.
-        */
-}
-
 void local_flush_tlb_one(unsigned long asid, unsigned long page)
 {
        unsigned long long match, pteh=0, lpage;
@@ -482,3 +466,12 @@ void local_flush_tlb_kernel_range(unsigned long start, unsigned long end)
         /* FIXME: Optimize this later.. */
         flush_tlb_all();
 }
+
+void __update_tlb(struct vm_area_struct *vma, unsigned long address, pte_t pte)
+{
+}
+
+void __update_cache(struct vm_area_struct *vma,
+                   unsigned long address, pte_t pte)
+{
+}