]> www.infradead.org Git - users/jedix/linux-maple.git/commitdiff
sparc64: Fix sentinel page table entry for 16G
authorNitin Gupta <nitin.m.gupta@oracle.com>
Thu, 25 Aug 2016 18:33:27 +0000 (11:33 -0700)
committerAllen Pais <allen.pais@oracle.com>
Thu, 15 Sep 2016 06:59:49 +0000 (12:29 +0530)
Currently no page table trimming is done for 16G pages
so _PAGE_PMD_HUGE must not be set for 16G. Also, for
this size, trimming would be done at PUD level, so
this flag should not be set anyways.

Orabug: 24353511

Signed-off-by: Nitin Gupta <nitin.m.gupta@oracle.com>
Signed-off-by: Allen Pais <allen.pais@oracle.com>
arch/sparc/mm/hugetlbpage.c

index b4e737416750ef615cbc3fb9a45a9031078759a5..cdb08177aaba55cd28d127999fbca77f6722284d 100644 (file)
@@ -311,18 +311,22 @@ static void huge_pte_at_flush_update(struct mm_struct *mm, unsigned long addr,
        }
 }
 
-static void form_sentinel(pte_t *sentinel_pte, pte_t entry, pte_t *pte)
+static void form_sentinel(pte_t *sentinel_pte, pte_t entry, pte_t *pte,
+                         unsigned int hugepage_shift)
 {
        pte_t sentinel = __pte(_PAGE_VALID | _PAGE_SPECIAL_4V |
-               _PAGE_PMD_HUGE | (pte_val(entry) & _PAGE_SZALL_4V) |
-               __pa(pte));
+               (pte_val(entry) & _PAGE_SZALL_4V) | __pa(pte));
 
        BUG_ON(__pa(pte) & _PAGE_SZALL_4V);
+        if (hugepage_shift == 31U) /* 2G page */
+               sentinel = __pte(pte_val(sentinel) | _PAGE_PMD_HUGE);
+
        *sentinel_pte = sentinel;
 }
 
 static bool huge_pte_at_handle_sentinel(pte_t *sentinel_pte, pte_t *pte,
-                                       pte_t orig, pte_t entry)
+                                       pte_t orig, pte_t entry,
+                                       unsigned int hugepage_shift)
 {
        bool rc = true;
 
@@ -336,7 +340,7 @@ static bool huge_pte_at_handle_sentinel(pte_t *sentinel_pte, pte_t *pte,
        } else if (pte_val(*sentinel_pte) & _PAGE_VALID) {
                *pte = *sentinel_pte;
        } else {
-               form_sentinel(sentinel_pte, entry, pte);
+               form_sentinel(sentinel_pte, entry, pte, hugepage_shift);
                *pte = entry;
        }
 
@@ -353,7 +357,7 @@ static bool __set_huge_pte_at(struct mm_struct *mm, unsigned long addr,
                pte_t orig = *pte;
 
                rc = huge_pte_at_handle_sentinel(sentinel_pte, pte, orig,
-                                       entry);
+                                                entry, hugepage_shift);
                huge_pte_at_flush_update(mm, addr, pte, orig, sentinel_pte);
        } else
                *pte = entry;