History

make /proc/$pid/numa_maps gather_stats() take variable page size

We need to teach the numa_maps code about transparent huge pages. The first step is to teach gather_stats() that the pte it is dealing with might represent more than one page. Note that will we use this in a moment for transparent huge pages since they have use a single pmd_t which _acts_ as a "surrogate" for a bunch of smaller pte_t's. I'm a _bit_ unhappy that this interface counts in hugetlbfs page sizes for hugetlbfs pages and PAGE_SIZE for normal pages. That means that to figure out how many _bytes_ "dirty=1" means, you must first know the hugetlbfs page size. That's easier said than done especially if you don't have visibility in to the mount. But, that's probably a discussion for another day especially since it would change behavior to fix it. But, just in case anyone wonders why this patch only passes a '1' in the hugetlb case...

Dave Hansen committed 15 years ago

Commit eb4866d1 parent 38867a21 file · +11 −10Browse files

Unified · Split

fs/proc/task_mmu.c+11−10
@@ -877,30 +877,31 @@ struct numa_maps_private { · 876 unmodified lines
877877 struct numa_maps md;
878878 };
879879
880−static void gather_stats(struct page *page, struct numa_maps *md, int pte_dirty)
880+static void gather_stats(struct page *page, struct numa_maps *md, int pte_dirty,
881+ unsigned long nr_pages)
881882 {
882883 int count = page_mapcount(page);
883884
884− md->pages++;
885+ md->pages += nr_pages;
885886 if (pte_dirty || PageDirty(page))
886− md->dirty++;
887+ md->dirty += nr_pages;
887888
888889 if (PageSwapCache(page))
889− md->swapcache++;
890+ md->swapcache += nr_pages;
890891
891892 if (PageActive(page) || PageUnevictable(page))
892− md->active++;
893+ md->active += nr_pages;
893894
894895 if (PageWriteback(page))
895− md->writeback++;
896+ md->writeback += nr_pages;
896897
897898 if (PageAnon(page))
898− md->anon++;
899+ md->anon += nr_pages;
899900
900901 if (count > md->mapcount_max)
901902 md->mapcount_max = count;
902903
903− md->node[page_to_nid(page)]++;
904+ md->node[page_to_nid(page)] += nr_pages;
904905 }
905906
906907 static int gather_pte_stats(pmd_t *pmd, unsigned long addr,
@@ -931,7 +932,7 @@ static int gather_pte_stats(pmd_t *pmd, unsigned long addr, · 24 unmodified lines
931932 if (!node_isset(nid, node_states[N_HIGH_MEMORY]))
932933 continue;
933934
934− gather_stats(page, md, pte_dirty(*pte));
935+ gather_stats(page, md, pte_dirty(*pte), 1);
935936
936937 } while (pte++, addr += PAGE_SIZE, addr != end);
937938 pte_unmap_unlock(orig_pte, ptl);
@@ -952,7 +953,7 @@ static int gather_hugetbl_stats(pte_t *pte, unsigned long hmask, · 14 unmodified lines
952953 return 0;
953954
954955 md = walk->private;
955− gather_stats(page, md, pte_dirty(*pte));
956+ gather_stats(page, md, pte_dirty(*pte), 1);
956957 return 0;
957958 }
958959