{
int cpu = smp_processor_id();
+#ifdef CONFIG_X86_SWITCH_PAGETABLES
+ if (tsk->mm)
+ tsk->thread_info->user_pgd = (void *)__pa(tsk->mm->pgd);
+#endif
if (likely(prev != next)) {
/* stop flush ipis for the previous mm */
cpu_clear(cpu, prev->cpu_vm_mask);
cpu_set(cpu, next->cpu_vm_mask);
/* Re-load page tables */
+#if !defined(CONFIG_X86_SWITCH_PAGETABLES)
load_cr3(next->pgd);
+#endif
/*
* load the LDT, if the LDT is different:
*/
- if (unlikely(prev->context.ldt != next->context.ldt))
+ if (unlikely(prev->context.size + next->context.size))
load_LDT_nolock(&next->context, cpu);
}
#ifdef CONFIG_SMP
/* We were in lazy tlb mode and leave_mm disabled
* tlb flush IPI delivery. We must reload %cr3.
*/
+#if !defined(CONFIG_X86_SWITCH_PAGETABLES)
load_cr3(next->pgd);
+#endif
load_LDT_nolock(&next->context, cpu);
}
}
asm("movl %0,%%fs ; movl %0,%%gs": :"r" (0))
#define activate_mm(prev, next) \
- switch_mm((prev),(next),NULL)
+ switch_mm((prev),(next),current)
#endif