From: "Aneesh Kumar K.V" <aneesh.ku...@linux.vnet.ibm.com>

Signed-off-by: Aneesh Kumar K.V <aneesh.ku...@linux.vnet.ibm.com>
---
 arch/powerpc/perf/callchain.c |   32 +++++++++++++++++++++-----------
 1 file changed, 21 insertions(+), 11 deletions(-)

diff --git a/arch/powerpc/perf/callchain.c b/arch/powerpc/perf/callchain.c
index 578cac7..99262ce 100644
--- a/arch/powerpc/perf/callchain.c
+++ b/arch/powerpc/perf/callchain.c
@@ -115,7 +115,7 @@ static int read_user_stack_slow(void __user *ptr, void 
*ret, int nb)
 {
        pgd_t *pgdir;
        pte_t *ptep, pte;
-       unsigned shift;
+       unsigned shift, hugepage;
        unsigned long addr = (unsigned long) ptr;
        unsigned long offset;
        unsigned long pfn;
@@ -125,20 +125,30 @@ static int read_user_stack_slow(void __user *ptr, void 
*ret, int nb)
        if (!pgdir)
                return -EFAULT;
 
-       ptep = find_linux_pte_or_hugepte(pgdir, addr, &shift, NULL);
+       ptep = find_linux_pte_or_hugepte(pgdir, addr, &shift, &hugepage);
        if (!shift)
                shift = PAGE_SHIFT;
 
-       /* align address to page boundary */
-       offset = addr & ((1UL << shift) - 1);
-       addr -= offset;
-
-       if (ptep == NULL)
-               return -EFAULT;
-       pte = *ptep;
-       if (!pte_present(pte) || !(pte_val(pte) & _PAGE_USER))
+       if (!ptep)
                return -EFAULT;
-       pfn = pte_pfn(pte);
+
+       if (hugepage) {
+               pmd_t pmd = *(pmd_t *)ptep;
+               shift = mmu_psize_defs[MMU_PAGE_16M].shift;
+               offset = addr & ((1UL << shift) - 1);
+
+               if (!pmd_large(pmd) || !(pmd_val(pmd) & PMD_HUGE_USER))
+                       return -EFAULT;
+               pfn = pmd_pfn(pmd);
+       } else {
+               offset = addr & ((1UL << shift) - 1);
+
+               pte = *ptep;
+               if (!pte_present(pte) || !(pte_val(pte) & _PAGE_USER))
+                       return -EFAULT;
+               pfn = pte_pfn(pte);
+       }
+
        if (!page_is_ram(pfn))
                return -EFAULT;
 
-- 
1.7.10

_______________________________________________
Linuxppc-dev mailing list
Linuxppc-dev@lists.ozlabs.org
https://lists.ozlabs.org/listinfo/linuxppc-dev

Reply via email to