aboutsummaryrefslogtreecommitdiffstats
path: root/arch/sparc/mm/tsb.c
diff options
context:
space:
mode:
Diffstat (limited to 'arch/sparc/mm/tsb.c')
-rw-r--r--arch/sparc/mm/tsb.c32
1 files changed, 17 insertions, 15 deletions
diff --git a/arch/sparc/mm/tsb.c b/arch/sparc/mm/tsb.c
index a06576683c38..a0604a493a36 100644
--- a/arch/sparc/mm/tsb.c
+++ b/arch/sparc/mm/tsb.c
@@ -76,14 +76,15 @@ void flush_tsb_user(struct tlb_batch *tb)
76 76
77 spin_lock_irqsave(&mm->context.lock, flags); 77 spin_lock_irqsave(&mm->context.lock, flags);
78 78
79 base = (unsigned long) mm->context.tsb_block[MM_TSB_BASE].tsb; 79 if (!tb->huge) {
80 nentries = mm->context.tsb_block[MM_TSB_BASE].tsb_nentries; 80 base = (unsigned long) mm->context.tsb_block[MM_TSB_BASE].tsb;
81 if (tlb_type == cheetah_plus || tlb_type == hypervisor) 81 nentries = mm->context.tsb_block[MM_TSB_BASE].tsb_nentries;
82 base = __pa(base); 82 if (tlb_type == cheetah_plus || tlb_type == hypervisor)
83 __flush_tsb_one(tb, PAGE_SHIFT, base, nentries); 83 base = __pa(base);
84 84 __flush_tsb_one(tb, PAGE_SHIFT, base, nentries);
85 }
85#if defined(CONFIG_HUGETLB_PAGE) || defined(CONFIG_TRANSPARENT_HUGEPAGE) 86#if defined(CONFIG_HUGETLB_PAGE) || defined(CONFIG_TRANSPARENT_HUGEPAGE)
86 if (mm->context.tsb_block[MM_TSB_HUGE].tsb) { 87 if (tb->huge && mm->context.tsb_block[MM_TSB_HUGE].tsb) {
87 base = (unsigned long) mm->context.tsb_block[MM_TSB_HUGE].tsb; 88 base = (unsigned long) mm->context.tsb_block[MM_TSB_HUGE].tsb;
88 nentries = mm->context.tsb_block[MM_TSB_HUGE].tsb_nentries; 89 nentries = mm->context.tsb_block[MM_TSB_HUGE].tsb_nentries;
89 if (tlb_type == cheetah_plus || tlb_type == hypervisor) 90 if (tlb_type == cheetah_plus || tlb_type == hypervisor)
@@ -94,20 +95,21 @@ void flush_tsb_user(struct tlb_batch *tb)
94 spin_unlock_irqrestore(&mm->context.lock, flags); 95 spin_unlock_irqrestore(&mm->context.lock, flags);
95} 96}
96 97
97void flush_tsb_user_page(struct mm_struct *mm, unsigned long vaddr) 98void flush_tsb_user_page(struct mm_struct *mm, unsigned long vaddr, bool huge)
98{ 99{
99 unsigned long nentries, base, flags; 100 unsigned long nentries, base, flags;
100 101
101 spin_lock_irqsave(&mm->context.lock, flags); 102 spin_lock_irqsave(&mm->context.lock, flags);
102 103
103 base = (unsigned long) mm->context.tsb_block[MM_TSB_BASE].tsb; 104 if (!huge) {
104 nentries = mm->context.tsb_block[MM_TSB_BASE].tsb_nentries; 105 base = (unsigned long) mm->context.tsb_block[MM_TSB_BASE].tsb;
105 if (tlb_type == cheetah_plus || tlb_type == hypervisor) 106 nentries = mm->context.tsb_block[MM_TSB_BASE].tsb_nentries;
106 base = __pa(base); 107 if (tlb_type == cheetah_plus || tlb_type == hypervisor)
107 __flush_tsb_one_entry(base, vaddr, PAGE_SHIFT, nentries); 108 base = __pa(base);
108 109 __flush_tsb_one_entry(base, vaddr, PAGE_SHIFT, nentries);
110 }
109#if defined(CONFIG_HUGETLB_PAGE) || defined(CONFIG_TRANSPARENT_HUGEPAGE) 111#if defined(CONFIG_HUGETLB_PAGE) || defined(CONFIG_TRANSPARENT_HUGEPAGE)
110 if (mm->context.tsb_block[MM_TSB_HUGE].tsb) { 112 if (huge && mm->context.tsb_block[MM_TSB_HUGE].tsb) {
111 base = (unsigned long) mm->context.tsb_block[MM_TSB_HUGE].tsb; 113 base = (unsigned long) mm->context.tsb_block[MM_TSB_HUGE].tsb;
112 nentries = mm->context.tsb_block[MM_TSB_HUGE].tsb_nentries; 114 nentries = mm->context.tsb_block[MM_TSB_HUGE].tsb_nentries;
113 if (tlb_type == cheetah_plus || tlb_type == hypervisor) 115 if (tlb_type == cheetah_plus || tlb_type == hypervisor)