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

Commit 9690c157 authored by Aneesh Kumar K.V's avatar Aneesh Kumar K.V Committed by Michael Ellerman
Browse files

powerpc/mm/radix: Fix always false comparison against MMU_NO_CONTEXT



In some of the radix TLB flush routines, we use a local to store the
mm->context.id, AKA the PID.

Currently we use an int, but the PID is unsigned long, so large values
of PID will be truncated. In particular MMU_NO_CONTEXT is -1, which
means all our comparisons against that value can never be true.

This means we'll issue TLB flushes when we shouldn't on radix enabled
machines.

Fix it by using an unsigned long for the local. Discovered by Coverity.

Fixes: 1a472c9d ("powerpc/mm/radix: Add tlbflush routines")
Signed-off-by: default avatarAneesh Kumar K.V <aneesh.kumar@linux.vnet.ibm.com>
Reviewed-by: default avatarBalbir Singh <bsingharora@gmail.com>
[mpe: Write change log]
Signed-off-by: default avatarMichael Ellerman <mpe@ellerman.id.au>
parent b3c0a4da
Loading
Loading
Loading
Loading
+4 −4
Original line number Diff line number Diff line
@@ -117,7 +117,7 @@ static inline void _tlbie_va(unsigned long va, unsigned long pid,
 */
void radix__local_flush_tlb_mm(struct mm_struct *mm)
{
	unsigned int pid;
	unsigned long pid;

	preempt_disable();
	pid = mm->context.id;
@@ -130,7 +130,7 @@ EXPORT_SYMBOL(radix__local_flush_tlb_mm);
void radix___local_flush_tlb_page(struct mm_struct *mm, unsigned long vmaddr,
			    unsigned long ap, int nid)
{
	unsigned int pid;
	unsigned long pid;

	preempt_disable();
	pid = mm ? mm->context.id : 0;
@@ -160,7 +160,7 @@ static int mm_is_core_local(struct mm_struct *mm)

void radix__flush_tlb_mm(struct mm_struct *mm)
{
	unsigned int pid;
	unsigned long pid;

	preempt_disable();
	pid = mm->context.id;
@@ -185,7 +185,7 @@ EXPORT_SYMBOL(radix__flush_tlb_mm);
void radix___flush_tlb_page(struct mm_struct *mm, unsigned long vmaddr,
		       unsigned long ap, int nid)
{
	unsigned int pid;
	unsigned long pid;

	preempt_disable();
	pid = mm ? mm->context.id : 0;