Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 47e4d851 authored by Martin Schwidefsky's avatar Martin Schwidefsky
Browse files

s390/mm: merge local / non-local IDTE helper



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: default avatarMartin Schwidefsky <schwidefsky@de.ibm.com>
parent 34eeaf37
Loading
Loading
Loading
Loading
+12 −32
Original line number Diff line number Diff line
@@ -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");
}

+5 −5
Original line number Diff line number Diff line
@@ -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;
}