aboutsummaryrefslogtreecommitdiffstats
path: root/fs/proc/task_mmu.c
diff options
context:
space:
mode:
Diffstat (limited to 'fs/proc/task_mmu.c')
-rw-r--r--fs/proc/task_mmu.c27
1 files changed, 7 insertions, 20 deletions
diff --git a/fs/proc/task_mmu.c b/fs/proc/task_mmu.c
index a05a669510a4..070553427dd5 100644
--- a/fs/proc/task_mmu.c
+++ b/fs/proc/task_mmu.c
@@ -662,31 +662,18 @@ static u64 huge_pte_to_pagemap_entry(pte_t pte, int offset)
662 return pme; 662 return pme;
663} 663}
664 664
665static int pagemap_hugetlb_range(pte_t *pte, unsigned long addr, 665/* This function walks within one hugetlb entry in the single call */
666 unsigned long end, struct mm_walk *walk) 666static int pagemap_hugetlb_range(pte_t *pte, unsigned long hmask,
667 unsigned long addr, unsigned long end,
668 struct mm_walk *walk)
667{ 669{
668 struct vm_area_struct *vma;
669 struct pagemapread *pm = walk->private; 670 struct pagemapread *pm = walk->private;
670 struct hstate *hs = NULL;
671 int err = 0; 671 int err = 0;
672 u64 pfn;
672 673
673 vma = find_vma(walk->mm, addr);
674 if (vma)
675 hs = hstate_vma(vma);
676 for (; addr != end; addr += PAGE_SIZE) { 674 for (; addr != end; addr += PAGE_SIZE) {
677 u64 pfn = PM_NOT_PRESENT; 675 int offset = (addr & ~hmask) >> PAGE_SHIFT;
678 676 pfn = huge_pte_to_pagemap_entry(*pte, offset);
679 if (vma && (addr >= vma->vm_end)) {
680 vma = find_vma(walk->mm, addr);
681 if (vma)
682 hs = hstate_vma(vma);
683 }
684
685 if (vma && (vma->vm_start <= addr) && is_vm_hugetlb_page(vma)) {
686 /* calculate pfn of the "raw" page in the hugepage. */
687 int offset = (addr & ~huge_page_mask(hs)) >> PAGE_SHIFT;
688 pfn = huge_pte_to_pagemap_entry(*pte, offset);
689 }
690 err = add_to_pagemap(addr, pfn, pm); 677 err = add_to_pagemap(addr, pfn, pm);
691 if (err) 678 if (err)
692 return err; 679 return err;