Commit e6e4f42e authored by Peter Zijlstra's avatar Peter Zijlstra

sparc64/mm: Implement pXX_leaf_size() support

Sparc64 has non-pagetable aligned large page support; wire up the
pXX_leaf_size() functions to report the correct pagetable page size.

This enables PERF_SAMPLE_{DATA,CODE}_PAGE_SIZE to report accurate
pagetable leaf sizes.
Signed-off-by: default avatarPeter Zijlstra (Intel) <peterz@infradead.org>
Link: https://lkml.kernel.org/r/20201126121121.301768209@infradead.org
parent c5eecbb5
...@@ -1121,6 +1121,19 @@ extern unsigned long cmdline_memory_size; ...@@ -1121,6 +1121,19 @@ extern unsigned long cmdline_memory_size;
asmlinkage void do_sparc64_fault(struct pt_regs *regs); asmlinkage void do_sparc64_fault(struct pt_regs *regs);
#ifdef CONFIG_HUGETLB_PAGE
#define pud_leaf_size pud_leaf_size
extern unsigned long pud_leaf_size(pud_t pud);
#define pmd_leaf_size pmd_leaf_size
extern unsigned long pmd_leaf_size(pmd_t pmd);
#define pte_leaf_size pte_leaf_size
extern unsigned long pte_leaf_size(pte_t pte);
#endif /* CONFIG_HUGETLB_PAGE */
#endif /* !(__ASSEMBLY__) */ #endif /* !(__ASSEMBLY__) */
#endif /* !(_SPARC64_PGTABLE_H) */ #endif /* !(_SPARC64_PGTABLE_H) */
...@@ -247,14 +247,17 @@ static unsigned int sun4u_huge_tte_to_shift(pte_t entry) ...@@ -247,14 +247,17 @@ static unsigned int sun4u_huge_tte_to_shift(pte_t entry)
return shift; return shift;
} }
static unsigned int huge_tte_to_shift(pte_t entry) static unsigned long tte_to_shift(pte_t entry)
{ {
unsigned long shift;
if (tlb_type == hypervisor) if (tlb_type == hypervisor)
shift = sun4v_huge_tte_to_shift(entry); return sun4v_huge_tte_to_shift(entry);
else
shift = sun4u_huge_tte_to_shift(entry); return sun4u_huge_tte_to_shift(entry);
}
static unsigned int huge_tte_to_shift(pte_t entry)
{
unsigned long shift = tte_to_shift(entry);
if (shift == PAGE_SHIFT) if (shift == PAGE_SHIFT)
WARN_ONCE(1, "tto_to_shift: invalid hugepage tte=0x%lx\n", WARN_ONCE(1, "tto_to_shift: invalid hugepage tte=0x%lx\n",
...@@ -272,6 +275,10 @@ static unsigned long huge_tte_to_size(pte_t pte) ...@@ -272,6 +275,10 @@ static unsigned long huge_tte_to_size(pte_t pte)
return size; return size;
} }
unsigned long pud_leaf_size(pud_t pud) { return 1UL << tte_to_shift(*(pte_t *)&pud); }
unsigned long pmd_leaf_size(pmd_t pmd) { return 1UL << tte_to_shift(*(pte_t *)&pmd); }
unsigned long pte_leaf_size(pte_t pte) { return 1UL << tte_to_shift(pte); }
pte_t *huge_pte_alloc(struct mm_struct *mm, pte_t *huge_pte_alloc(struct mm_struct *mm,
unsigned long addr, unsigned long sz) unsigned long addr, unsigned long sz)
{ {
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment