[SPARC64]: Avoid dcache-dirty page state management on sun4v.
authorDavid S. Miller <davem@sunset.davemloft.net>
Mon, 27 Feb 2006 03:44:50 +0000 (19:44 -0800)
committerDavid S. Miller <davem@sunset.davemloft.net>
Mon, 20 Mar 2006 09:14:06 +0000 (01:14 -0800)
It is totally wasted work, since we have no D-cache aliasing
issues on sun4v.

Signed-off-by: David S. Miller <davem@davemloft.net>
arch/sparc64/mm/init.c
arch/sparc64/mm/tlb.c

index ccf083aecb65359dc455126f4938279cf7bb8ff2..87d5d1af1adb8461b75f8ef08c6f108ad59317ac 100644 (file)
@@ -188,8 +188,9 @@ atomic_t dcpage_flushes_xcall = ATOMIC_INIT(0);
 #endif
 #endif
 
-__inline__ void flush_dcache_page_impl(struct page *page)
+inline void flush_dcache_page_impl(struct page *page)
 {
+       BUG_ON(tlb_type == hypervisor);
 #ifdef CONFIG_DEBUG_DCFLUSH
        atomic_inc(&dcpage_flushes);
 #endif
@@ -279,29 +280,31 @@ unsigned long _PAGE_SZBITS __read_mostly;
 void update_mmu_cache(struct vm_area_struct *vma, unsigned long address, pte_t pte)
 {
        struct mm_struct *mm;
-       struct page *page;
-       unsigned long pfn;
-       unsigned long pg_flags;
-
-       pfn = pte_pfn(pte);
-       if (pfn_valid(pfn) &&
-           (page = pfn_to_page(pfn), page_mapping(page)) &&
-           ((pg_flags = page->flags) & (1UL << PG_dcache_dirty))) {
-               int cpu = ((pg_flags >> PG_dcache_cpu_shift) &
-                          PG_dcache_cpu_mask);
-               int this_cpu = get_cpu();
-
-               /* This is just to optimize away some function calls
-                * in the SMP case.
-                */
-               if (cpu == this_cpu)
-                       flush_dcache_page_impl(page);
-               else
-                       smp_flush_dcache_page_impl(page, cpu);
 
-               clear_dcache_dirty_cpu(page, cpu);
+       if (tlb_type != hypervisor) {
+               unsigned long pfn = pte_pfn(pte);
+               unsigned long pg_flags;
+               struct page *page;
+
+               if (pfn_valid(pfn) &&
+                   (page = pfn_to_page(pfn), page_mapping(page)) &&
+                   ((pg_flags = page->flags) & (1UL << PG_dcache_dirty))) {
+                       int cpu = ((pg_flags >> PG_dcache_cpu_shift) &
+                                  PG_dcache_cpu_mask);
+                       int this_cpu = get_cpu();
+
+                       /* This is just to optimize away some function calls
+                        * in the SMP case.
+                        */
+                       if (cpu == this_cpu)
+                               flush_dcache_page_impl(page);
+                       else
+                               smp_flush_dcache_page_impl(page, cpu);
+
+                       clear_dcache_dirty_cpu(page, cpu);
 
-               put_cpu();
+                       put_cpu();
+               }
        }
 
        mm = vma->vm_mm;
@@ -321,6 +324,9 @@ void flush_dcache_page(struct page *page)
        struct address_space *mapping;
        int this_cpu;
 
+       if (tlb_type == hypervisor)
+               return;
+
        /* Do not bother with the expensive D-cache flush if it
         * is merely the zero page.  The 'bigcore' testcase in GDB
         * causes this case to run millions of times.
index 78357cc2a0b74e1d1242f38e5259a4452b04a129..a079cf42505ed08906d42b0371372d6842d8a8b7 100644 (file)
@@ -49,7 +49,8 @@ void tlb_batch_add(struct mm_struct *mm, unsigned long vaddr, pte_t *ptep, pte_t
        if (pte_exec(orig))
                vaddr |= 0x1UL;
 
-       if (pte_dirty(orig)) {
+       if (tlb_type != hypervisor &&
+           pte_dirty(orig)) {
                unsigned long paddr, pfn = pte_pfn(orig);
                struct address_space *mapping;
                struct page *page;