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

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

powerpc/mm/subpage: Initialise user psize correctly



As part of the radix support we switched Book3s64 to use a value of ~0
for MMU_NO_CONTEXT. That is because id 0 is special on radix.

However that broke the logic in init_new_context(). The code there needs
to differentiate between a newly allocated context and one inherited via
fork. Previously it worked because a newly allocated context has an id
of zero (because it was just memset() to zero), which used to match
MMU_NO_CONTEXT, and therefore slice_mm_new_context() did the right
thing.

Instead check against a context.id value of zero instead of using
slice_mm_new_context().

Without this patch we never call slice_set_user_psize(), and end up with
a slice psize value of zero and we always end up using 4K HPTE.

Fixes: 1a472c9d ("powerpc/mm/radix: Add tlbflush routines")
Signed-off-by: default avatarAneesh Kumar K.V <aneesh.kumar@linux.vnet.ibm.com>
Signed-off-by: default avatarMichael Ellerman <mpe@ellerman.id.au>
parent bb03efe2
Loading
Loading
Loading
Loading
+10 −1
Original line number Diff line number Diff line
@@ -85,8 +85,17 @@ int init_new_context(struct task_struct *tsk, struct mm_struct *mm)
		/* The old code would re-promote on fork, we don't do that
		 * when using slices as it could cause problem promoting slices
		 * that have been forced down to 4K
		 *
		 * For book3s we have MMU_NO_CONTEXT set to be ~0. Hence check
		 * explicitly against context.id == 0. This ensures that we
		 * properly initialize context slice details for newly allocated
		 * mm's (which will have id == 0) and don't alter context slice
		 * inherited via fork (which will have id != 0).
		 *
		 * We should not be calling init_new_context() on init_mm. Hence a
		 * check against 0 is ok.
		 */
		if (slice_mm_new_context(mm))
		if (mm->context.id == 0)
			slice_set_user_psize(mm, mmu_virtual_psize);
		subpage_prot_init_new_context(mm);
	}