diff options
Diffstat (limited to 'arch/sparc/mm/tsb.c')
-rw-r--r-- | arch/sparc/mm/tsb.c | 32 |
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 | ||
97 | void flush_tsb_user_page(struct mm_struct *mm, unsigned long vaddr) | 98 | void 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) |