sparc64: Fix build error in flush_tsb_user_page
authorNitin Gupta <nitin.m.gupta@oracle.com>
Fri, 24 Feb 2017 11:03:16 +0000 (03:03 -0800)
committerDavid S. Miller <davem@davemloft.net>
Fri, 24 Feb 2017 16:26:21 +0000 (08:26 -0800)
Patch "sparc64: Add 64K page size support"
unconditionally used __flush_huge_tsb_one_entry()
which is available only when hugetlb support is
enabled.

Another issue was incorrect TSB flushing for 64K
pages in flush_tsb_user().

Signed-off-by: Nitin Gupta <nitin.m.gupta@oracle.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
arch/sparc/mm/hugetlbpage.c
arch/sparc/mm/tsb.c

index 605bfceb7d54f3031d7b601d2a865e7526fff6cb..e98a3f2e8f0f4839c30a61c8bf583d0753a6219c 100644 (file)
@@ -309,7 +309,7 @@ void set_huge_pte_at(struct mm_struct *mm, unsigned long addr,
 
        addr &= ~(size - 1);
        orig = *ptep;
-       orig_shift = pte_none(orig) ? PAGE_SIZE : huge_tte_to_shift(orig);
+       orig_shift = pte_none(orig) ? PAGE_SHIFT : huge_tte_to_shift(orig);
 
        for (i = 0; i < nptes; i++)
                ptep[i] = __pte(pte_val(entry) + (i << shift));
@@ -335,7 +335,8 @@ pte_t huge_ptep_get_and_clear(struct mm_struct *mm, unsigned long addr,
        else
                nptes = size >> PAGE_SHIFT;
 
-       hugepage_shift = pte_none(entry) ? PAGE_SIZE : huge_tte_to_shift(entry);
+       hugepage_shift = pte_none(entry) ? PAGE_SHIFT :
+               huge_tte_to_shift(entry);
 
        if (pte_present(entry))
                mm->context.hugetlb_pte_count -= nptes;
index e39fc57ad850dd66d85e937e264702af57beb3b4..23479c3d39f0221a98c86cf3923a040b3b3be658 100644 (file)
@@ -120,12 +120,18 @@ void flush_tsb_user(struct tlb_batch *tb)
 
        spin_lock_irqsave(&mm->context.lock, flags);
 
-       if (tb->hugepage_shift == PAGE_SHIFT) {
+       if (tb->hugepage_shift < HPAGE_SHIFT) {
                base = (unsigned long) mm->context.tsb_block[MM_TSB_BASE].tsb;
                nentries = mm->context.tsb_block[MM_TSB_BASE].tsb_nentries;
                if (tlb_type == cheetah_plus || tlb_type == hypervisor)
                        base = __pa(base);
-               __flush_tsb_one(tb, PAGE_SHIFT, base, nentries);
+               if (tb->hugepage_shift == PAGE_SHIFT)
+                       __flush_tsb_one(tb, PAGE_SHIFT, base, nentries);
+#if defined(CONFIG_HUGETLB_PAGE)
+               else
+                       __flush_huge_tsb_one(tb, PAGE_SHIFT, base, nentries,
+                                            tb->hugepage_shift);
+#endif
        }
 #if defined(CONFIG_HUGETLB_PAGE) || defined(CONFIG_TRANSPARENT_HUGEPAGE)
        else if (mm->context.tsb_block[MM_TSB_HUGE].tsb) {
@@ -152,8 +158,14 @@ void flush_tsb_user_page(struct mm_struct *mm, unsigned long vaddr,
                nentries = mm->context.tsb_block[MM_TSB_BASE].tsb_nentries;
                if (tlb_type == cheetah_plus || tlb_type == hypervisor)
                        base = __pa(base);
-               __flush_huge_tsb_one_entry(base, vaddr, PAGE_SHIFT, nentries,
-                                          hugepage_shift);
+               if (hugepage_shift == PAGE_SHIFT)
+                       __flush_tsb_one_entry(base, vaddr, PAGE_SHIFT,
+                                             nentries);
+#if defined(CONFIG_HUGETLB_PAGE)
+               else
+                       __flush_huge_tsb_one_entry(base, vaddr, PAGE_SHIFT,
+                                                  nentries, hugepage_shift);
+#endif
        }
 #if defined(CONFIG_HUGETLB_PAGE) || defined(CONFIG_TRANSPARENT_HUGEPAGE)
        else if (mm->context.tsb_block[MM_TSB_HUGE].tsb) {