]> www.pilppa.org Git - linux-2.6-omap-h63xx.git/blobdiff - include/asm-s390/tlbflush.h
[S390] System z large page support.
[linux-2.6-omap-h63xx.git] / include / asm-s390 / tlbflush.h
index 35fb4f9127b2ae41e35683eb0dccb245413cdcec..d60394b9745ef60387ad385013f18f23d622980c 100644 (file)
@@ -2,6 +2,7 @@
 #define _S390_TLBFLUSH_H
 
 #include <linux/mm.h>
+#include <linux/sched.h>
 #include <asm/processor.h>
 #include <asm/pgalloc.h>
 
@@ -13,12 +14,14 @@ static inline void __tlb_flush_local(void)
        asm volatile("ptlb" : : : "memory");
 }
 
+#ifdef CONFIG_SMP
 /*
  * Flush all tlb entries on all cpus.
  */
+void smp_ptlb_all(void);
+
 static inline void __tlb_flush_global(void)
 {
-       extern void smp_ptlb_all(void);
        register unsigned long reg2 asm("2");
        register unsigned long reg3 asm("3");
        register unsigned long reg4 asm("4");
@@ -39,6 +42,25 @@ static inline void __tlb_flush_global(void)
                : : "d" (reg2), "d" (reg3), "d" (reg4), "m" (dummy) : "cc" );
 }
 
+static inline void __tlb_flush_full(struct mm_struct *mm)
+{
+       cpumask_t local_cpumask;
+
+       preempt_disable();
+       /*
+        * If the process only ran on the local cpu, do a local flush.
+        */
+       local_cpumask = cpumask_of_cpu(smp_processor_id());
+       if (cpus_equal(mm->cpu_vm_mask, local_cpumask))
+               __tlb_flush_local();
+       else
+               __tlb_flush_global();
+       preempt_enable();
+}
+#else
+#define __tlb_flush_full(mm)   __tlb_flush_local()
+#endif
+
 /*
  * Flush all tlb entries of a page table on all cpus.
  */
@@ -51,8 +73,6 @@ static inline void __tlb_flush_idte(unsigned long asce)
 
 static inline void __tlb_flush_mm(struct mm_struct * mm)
 {
-       cpumask_t local_cpumask;
-
        if (unlikely(cpus_empty(mm->cpu_vm_mask)))
                return;
        /*
@@ -69,16 +89,7 @@ static inline void __tlb_flush_mm(struct mm_struct * mm)
                                 mm->context.asce_bits);
                return;
        }
-       preempt_disable();
-       /*
-        * If the process only ran on the local cpu, do a local flush.
-        */
-       local_cpumask = cpumask_of_cpu(smp_processor_id());
-       if (cpus_equal(mm->cpu_vm_mask, local_cpumask))
-               __tlb_flush_local();
-       else
-               __tlb_flush_global();
-       preempt_enable();
+       __tlb_flush_full(mm);
 }
 
 static inline void __tlb_flush_mm_cond(struct mm_struct * mm)