diff options
-rw-r--r-- | fs/proc/task_mmu.c | 39 |
1 files changed, 24 insertions, 15 deletions
diff --git a/fs/proc/task_mmu.c b/fs/proc/task_mmu.c index 61342a454bd9..9dca07e0758d 100644 --- a/fs/proc/task_mmu.c +++ b/fs/proc/task_mmu.c | |||
@@ -904,6 +904,29 @@ static void gather_stats(struct page *page, struct numa_maps *md, int pte_dirty, | |||
904 | md->node[page_to_nid(page)] += nr_pages; | 904 | md->node[page_to_nid(page)] += nr_pages; |
905 | } | 905 | } |
906 | 906 | ||
907 | static struct page *can_gather_numa_stats(pte_t pte, struct vm_area_struct *vma, | ||
908 | unsigned long addr) | ||
909 | { | ||
910 | struct page *page; | ||
911 | int nid; | ||
912 | |||
913 | if (!pte_present(pte)) | ||
914 | return NULL; | ||
915 | |||
916 | page = vm_normal_page(vma, addr, pte); | ||
917 | if (!page) | ||
918 | return NULL; | ||
919 | |||
920 | if (PageReserved(page)) | ||
921 | return NULL; | ||
922 | |||
923 | nid = page_to_nid(page); | ||
924 | if (!node_isset(nid, node_states[N_HIGH_MEMORY])) | ||
925 | return NULL; | ||
926 | |||
927 | return page; | ||
928 | } | ||
929 | |||
907 | static int gather_pte_stats(pmd_t *pmd, unsigned long addr, | 930 | static int gather_pte_stats(pmd_t *pmd, unsigned long addr, |
908 | unsigned long end, struct mm_walk *walk) | 931 | unsigned long end, struct mm_walk *walk) |
909 | { | 932 | { |
@@ -915,23 +938,9 @@ static int gather_pte_stats(pmd_t *pmd, unsigned long addr, | |||
915 | md = walk->private; | 938 | md = walk->private; |
916 | orig_pte = pte = pte_offset_map_lock(walk->mm, pmd, addr, &ptl); | 939 | orig_pte = pte = pte_offset_map_lock(walk->mm, pmd, addr, &ptl); |
917 | do { | 940 | do { |
918 | struct page *page; | 941 | struct page *page = can_gather_numa_stats(*pte, md->vma, addr); |
919 | int nid; | ||
920 | |||
921 | if (!pte_present(*pte)) | ||
922 | continue; | ||
923 | |||
924 | page = vm_normal_page(md->vma, addr, *pte); | ||
925 | if (!page) | 942 | if (!page) |
926 | continue; | 943 | continue; |
927 | |||
928 | if (PageReserved(page)) | ||
929 | continue; | ||
930 | |||
931 | nid = page_to_nid(page); | ||
932 | if (!node_isset(nid, node_states[N_HIGH_MEMORY])) | ||
933 | continue; | ||
934 | |||
935 | gather_stats(page, md, pte_dirty(*pte), 1); | 944 | gather_stats(page, md, pte_dirty(*pte), 1); |
936 | 945 | ||
937 | } while (pte++, addr += PAGE_SIZE, addr != end); | 946 | } while (pte++, addr += PAGE_SIZE, addr != end); |