diff --git a/fs/proc/task_mmu.c b/fs/proc/task_mmu.c index cfe2c4e32533192cf894ad8ab0d5fbcc6be104c8..93815b2b84401ea362f1cc52b0900ca8ed7c60f5 100644 --- a/fs/proc/task_mmu.c +++ b/fs/proc/task_mmu.c @@ -709,9 +709,7 @@ static int smaps_hugetlb_range(pte_t *pte, unsigned long hmask, page = device_private_entry_to_page(swpent); } if (page) { - int mapcount = page_mapcount(page); - - if (mapcount >= 2) + if (page_mapcount(page) >= 2 || hugetlb_pmd_shared(pte)) mss->shared_hugetlb += huge_page_size(hstate_vma(vma)); else mss->private_hugetlb += huge_page_size(hstate_vma(vma)); diff --git a/include/linux/hugetlb.h b/include/linux/hugetlb.h index dfd9a8c945e1d285176b6d366854d8870f2b3afd..868aea82db2dfdbd618128cdabc23617d5e4b23e 100644 --- a/include/linux/hugetlb.h +++ b/include/linux/hugetlb.h @@ -7,6 +7,7 @@ #include #include #include +#include #include #include #include @@ -784,4 +785,16 @@ static inline int hugetlb_insert__hugepage_pte_by_pa(struct mm_struct *mm, pte_t make_huge_pte(struct vm_area_struct *vma, struct page *page, int writable); #endif +#ifdef CONFIG_ARCH_WANT_HUGE_PMD_SHARE +static inline bool hugetlb_pmd_shared(pte_t *pte) +{ + return page_count(virt_to_page(pte)) > 1; +} +#else +static inline bool hugetlb_pmd_shared(pte_t *pte) +{ + return false; +} +#endif + #endif /* _LINUX_HUGETLB_H */