s390/mm: merge local / non-local IDTE helper
authorMartin Schwidefsky <schwidefsky@de.ibm.com>
Tue, 14 Jun 2016 10:41:35 +0000 (12:41 +0200)
committerMartin Schwidefsky <schwidefsky@de.ibm.com>
Wed, 24 Aug 2016 07:23:56 +0000 (09:23 +0200)
Merge the __p[m|u]xdp_idte and __p[m|u]dp_idte_local functions into a
single __p[m|u]dp_idte function with an additional parameter.

Signed-off-by: Martin Schwidefsky <schwidefsky@de.ibm.com>
arch/s390/include/asm/pgtable.h
arch/s390/mm/pgtable.c

index 7ef2306e35f353b6ded3465a47cbc3ebbac7ce74..0362cd5fa187c5e580fd1c3ab250546873eca7ba 100644 (file)
@@ -1235,53 +1235,33 @@ static inline void __pmdp_csp(pmd_t *pmdp)
            pmd_val(*pmdp) | _SEGMENT_ENTRY_INVALID);
 }
 
-static inline void __pmdp_idte(unsigned long address, pmd_t *pmdp)
-{
-       unsigned long sto;
-
-       sto = (unsigned long) pmdp - pmd_index(address) * sizeof(pmd_t);
-       asm volatile(
-               "       .insn   rrf,0xb98e0000,%2,%3,0,0"
-               : "=m" (*pmdp)
-               : "m" (*pmdp), "a" (sto), "a" ((address & HPAGE_MASK))
-               : "cc" );
-}
-
-static inline void __pudp_idte(unsigned long address, pud_t *pudp)
-{
-       unsigned long r3o;
-
-       r3o = (unsigned long) pudp - pud_index(address) * sizeof(pud_t);
-       r3o |= _ASCE_TYPE_REGION3;
-       asm volatile(
-               "       .insn   rrf,0xb98e0000,%2,%3,0,0"
-               : "=m" (*pudp)
-               : "m" (*pudp), "a" (r3o), "a" ((address & PUD_MASK))
-               : "cc");
-}
+#define IDTE_GLOBAL    0
+#define IDTE_LOCAL     1
 
-static inline void __pmdp_idte_local(unsigned long address, pmd_t *pmdp)
+static inline void __pmdp_idte(unsigned long address, pmd_t *pmdp, int local)
 {
        unsigned long sto;
 
        sto = (unsigned long) pmdp - pmd_index(address) * sizeof(pmd_t);
        asm volatile(
-               "       .insn   rrf,0xb98e0000,%2,%3,0,1"
-               : "=m" (*pmdp)
-               : "m" (*pmdp), "a" (sto), "a" ((address & HPAGE_MASK))
+               "       .insn   rrf,0xb98e0000,%[r1],%[r2],0,%[m4]"
+               : "+m" (*pmdp)
+               : [r1] "a" (sto), [r2] "a" ((address & HPAGE_MASK)),
+                 [m4] "i" (local)
                : "cc" );
 }
 
-static inline void __pudp_idte_local(unsigned long address, pud_t *pudp)
+static inline void __pudp_idte(unsigned long address, pud_t *pudp, int local)
 {
        unsigned long r3o;
 
        r3o = (unsigned long) pudp - pud_index(address) * sizeof(pud_t);
        r3o |= _ASCE_TYPE_REGION3;
        asm volatile(
-               "       .insn   rrf,0xb98e0000,%2,%3,0,1"
-               : "=m" (*pudp)
-               : "m" (*pudp), "a" (r3o), "a" ((address & PUD_MASK))
+               "       .insn   rrf,0xb98e0000,%[r1],%[r2],0,%[m4]"
+               : "+m" (*pudp)
+               : [r1] "a" (r3o), [r2] "a" ((address & PUD_MASK)),
+                 [m4] "i" (local)
                : "cc");
 }
 
index 1dc6cad9a5acff94e4d977ea2cef90d6f0dc5402..7a1897c51c5495f3f2b13d86ba8f6344e2234788 100644 (file)
@@ -301,9 +301,9 @@ static inline pmd_t pmdp_flush_direct(struct mm_struct *mm,
        atomic_inc(&mm->context.flush_count);
        if (MACHINE_HAS_TLB_LC &&
            cpumask_equal(mm_cpumask(mm), cpumask_of(smp_processor_id())))
-               __pmdp_idte_local(addr, pmdp);
+               __pmdp_idte(addr, pmdp, IDTE_LOCAL);
        else
-               __pmdp_idte(addr, pmdp);
+               __pmdp_idte(addr, pmdp, IDTE_GLOBAL);
        atomic_dec(&mm->context.flush_count);
        return old;
 }
@@ -322,7 +322,7 @@ static inline pmd_t pmdp_flush_lazy(struct mm_struct *mm,
                pmd_val(*pmdp) |= _SEGMENT_ENTRY_INVALID;
                mm->context.flush_mm = 1;
        } else if (MACHINE_HAS_IDTE)
-               __pmdp_idte(addr, pmdp);
+               __pmdp_idte(addr, pmdp, IDTE_GLOBAL);
        else
                __pmdp_csp(pmdp);
        atomic_dec(&mm->context.flush_count);
@@ -374,9 +374,9 @@ static inline pud_t pudp_flush_direct(struct mm_struct *mm,
        atomic_inc(&mm->context.flush_count);
        if (MACHINE_HAS_TLB_LC &&
            cpumask_equal(mm_cpumask(mm), cpumask_of(smp_processor_id())))
-               __pudp_idte_local(addr, pudp);
+               __pudp_idte(addr, pudp, IDTE_LOCAL);
        else
-               __pudp_idte(addr, pudp);
+               __pudp_idte(addr, pudp, IDTE_GLOBAL);
        atomic_dec(&mm->context.flush_count);
        return old;
 }