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); |
