{
        int index;
        int err;
-       int new_context = (mm->context.id == 0);
 
 again:
        if (!idr_pre_get(&mmu_context_idr, GFP_KERNEL))
                return -ENOMEM;
        }
 
-       mm->context.id = index;
 #ifdef CONFIG_PPC_MM_SLICES
        /* 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
         */
-       if (new_context)
+       if (mm->context.id == 0)
                slice_set_user_psize(mm, mmu_virtual_psize);
 #else
        mm->context.user_psize = mmu_virtual_psize;
        mm->context.sllp = SLB_VSID_USER |
                mmu_psize_defs[mmu_virtual_psize].sllp;
 #endif
+       mm->context.id = index;
 
        return 0;
 }
 
  *
  * This is also called in init_new_context() to change back the user
  * psize from whatever the parent context had it set to
+ * N.B. This may be called before mm->context.id has been set.
  *
  * This function will only change the content of the {low,high)_slice_psize
  * masks, it will not flush SLBs as this shall be handled lazily by the