Merge branch 'upstream-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/mfashe...
[firefly-linux-kernel-4.4.55.git] / include / asm-sparc64 / mmu_context.h
index e7974321d052bcf20c8472f03e7d372f187dda80..9fc225ed5500d20c5372653389d8783ffc49ef4b 100644 (file)
@@ -9,6 +9,7 @@
 #include <linux/spinlock.h>
 #include <asm/system.h>
 #include <asm/spitfire.h>
+#include <asm-generic/mm_hooks.h>
 
 static inline void enter_lazy_tlb(struct mm_struct *mm, struct task_struct *tsk)
 {
@@ -29,20 +30,25 @@ extern int init_new_context(struct task_struct *tsk, struct mm_struct *mm);
 extern void destroy_context(struct mm_struct *mm);
 
 extern void __tsb_context_switch(unsigned long pgd_pa,
-                                unsigned long tsb_reg,
-                                unsigned long tsb_vaddr,
-                                unsigned long tsb_pte,
+                                struct tsb_config *tsb_base,
+                                struct tsb_config *tsb_huge,
                                 unsigned long tsb_descr_pa);
 
 static inline void tsb_context_switch(struct mm_struct *mm)
 {
-       __tsb_context_switch(__pa(mm->pgd), mm->context.tsb_reg_val,
-                            mm->context.tsb_map_vaddr,
-                            mm->context.tsb_map_pte,
-                            __pa(&mm->context.tsb_descr));
+       __tsb_context_switch(__pa(mm->pgd),
+                            &mm->context.tsb_block[0],
+#ifdef CONFIG_HUGETLB_PAGE
+                            (mm->context.tsb_block[1].tsb ?
+                             &mm->context.tsb_block[1] :
+                             NULL)
+#else
+                            NULL
+#endif
+                            , __pa(&mm->context.tsb_descr[0]));
 }
 
-extern void tsb_grow(struct mm_struct *mm, unsigned long mm_rss);
+extern void tsb_grow(struct mm_struct *mm, unsigned long tsb_index, unsigned long mm_rss);
 #ifdef CONFIG_SMP
 extern void smp_tsb_sync(struct mm_struct *mm);
 #else
@@ -70,6 +76,9 @@ static inline void switch_mm(struct mm_struct *old_mm, struct mm_struct *mm, str
        unsigned long ctx_valid, flags;
        int cpu;
 
+       if (unlikely(mm == &init_mm))
+               return;
+
        spin_lock_irqsave(&mm->context.lock, flags);
        ctx_valid = CTX_VALID(mm->context);
        if (!ctx_valid)