diff options
Diffstat (limited to 'include/asm-ppc64/mmu_context.h')
-rw-r--r-- | include/asm-ppc64/mmu_context.h | 15 |
1 files changed, 14 insertions, 1 deletions
diff --git a/include/asm-ppc64/mmu_context.h b/include/asm-ppc64/mmu_context.h index 820dd729b895..4f512e9fa6b8 100644 --- a/include/asm-ppc64/mmu_context.h +++ b/include/asm-ppc64/mmu_context.h | |||
@@ -16,8 +16,16 @@ | |||
16 | * 2 of the License, or (at your option) any later version. | 16 | * 2 of the License, or (at your option) any later version. |
17 | */ | 17 | */ |
18 | 18 | ||
19 | static inline void enter_lazy_tlb(struct mm_struct *mm, struct task_struct *tsk) | 19 | /* |
20 | * Getting into a kernel thread, there is no valid user segment, mark | ||
21 | * paca->pgdir NULL so that SLB miss on user addresses will fault | ||
22 | */ | ||
23 | static inline void enter_lazy_tlb(struct mm_struct *mm, | ||
24 | struct task_struct *tsk) | ||
20 | { | 25 | { |
26 | #ifdef CONFIG_PPC_64K_PAGES | ||
27 | get_paca()->pgdir = NULL; | ||
28 | #endif /* CONFIG_PPC_64K_PAGES */ | ||
21 | } | 29 | } |
22 | 30 | ||
23 | #define NO_CONTEXT 0 | 31 | #define NO_CONTEXT 0 |
@@ -40,8 +48,13 @@ static inline void switch_mm(struct mm_struct *prev, struct mm_struct *next, | |||
40 | cpu_set(smp_processor_id(), next->cpu_vm_mask); | 48 | cpu_set(smp_processor_id(), next->cpu_vm_mask); |
41 | 49 | ||
42 | /* No need to flush userspace segments if the mm doesnt change */ | 50 | /* No need to flush userspace segments if the mm doesnt change */ |
51 | #ifdef CONFIG_PPC_64K_PAGES | ||
52 | if (prev == next && get_paca()->pgdir == next->pgd) | ||
53 | return; | ||
54 | #else | ||
43 | if (prev == next) | 55 | if (prev == next) |
44 | return; | 56 | return; |
57 | #endif /* CONFIG_PPC_64K_PAGES */ | ||
45 | 58 | ||
46 | #ifdef CONFIG_ALTIVEC | 59 | #ifdef CONFIG_ALTIVEC |
47 | if (cpu_has_feature(CPU_FTR_ALTIVEC)) | 60 | if (cpu_has_feature(CPU_FTR_ALTIVEC)) |