@@ -546,10 +546,17 @@ static void smaps_pmd_entry(pmd_t *pmd, unsigned long addr,
546546 struct mem_size_stats * mss = walk -> private ;
547547 struct vm_area_struct * vma = walk -> vma ;
548548 bool locked = !!(vma -> vm_flags & VM_LOCKED );
549- struct page * page ;
549+ struct page * page = NULL ;
550+
551+ if (pmd_present (* pmd )) {
552+ /* FOLL_DUMP will return -EFAULT on huge zero page */
553+ page = follow_trans_huge_pmd (vma , addr , pmd , FOLL_DUMP );
554+ } else if (unlikely (thp_migration_supported () && is_swap_pmd (* pmd ))) {
555+ swp_entry_t entry = pmd_to_swp_entry (* pmd );
550556
551- /* FOLL_DUMP will return -EFAULT on huge zero page */
552- page = follow_trans_huge_pmd (vma , addr , pmd , FOLL_DUMP );
557+ if (is_migration_entry (entry ))
558+ page = migration_entry_to_page (entry );
559+ }
553560 if (IS_ERR_OR_NULL (page ))
554561 return ;
555562 if (PageAnon (page ))
@@ -578,8 +585,7 @@ static int smaps_pte_range(pmd_t *pmd, unsigned long addr, unsigned long end,
578585
579586 ptl = pmd_trans_huge_lock (pmd , vma );
580587 if (ptl ) {
581- if (pmd_present (* pmd ))
582- smaps_pmd_entry (pmd , addr , walk );
588+ smaps_pmd_entry (pmd , addr , walk );
583589 spin_unlock (ptl );
584590 goto out ;
585591 }
0 commit comments