Hi, Kirill I believe there is a typo in your previous commit, but you didn't include it in this series of patch set. Below is the link for the commit. I think you are trying to decrease the value NR_ANON_PAGES in page_remove_rmap, but it is currently adding the value instead when using __mod_zone_page_state.Let me know if you would like to fix it in your commit or you want another patch from me. Thanks! https://git.kernel.org/cgit/linux/kernel/git/kas/linux.git/commit/?h=thp/pagecache&id=90ca9354b08a7b26ba468c7d2ea1229e93d67b92 @@ -1151,11 +1151,11 @@ void page_remove_rmap(struct page *page) goto out; if (anon) { mem_cgroup_uncharge_page(page); - if (!PageTransHuge(page)) - __dec_zone_page_state(page, NR_ANON_PAGES); - else + if (PageTransHuge(page)) __dec_zone_page_state(page, NR_ANON_TRANSPARENT_HUGEPAGES); + __mod_zone_page_state(page_zone(page), NR_ANON_PAGES, + hpage_nr_pages(page)); } else { __dec_zone_page_state(page, NR_FILE_MAPPED); mem_cgroup_dec_page_stat(page, MEMCG_NR_FILE_MAPPED); Best wishes, -- Ning Qu (曲宁) | Software Engineer | quning@google.com | +1-408-418-6066 On Sat, Aug 3, 2013 at 7:17 PM, Kirill A. Shutemov < kirill.shutemov@linux.intel.com> wrote: > From: "Kirill A. Shutemov" > > The patch adds new zone stat to count file transparent huge pages and > adjust related places. > > For now we don't count mapped or dirty file thp pages separately. > > The patch depends on patch > thp: account anon transparent huge pages into NR_ANON_PAGES > > Signed-off-by: Kirill A. Shutemov > Acked-by: Dave Hansen > --- > drivers/base/node.c | 4 ++++ > fs/proc/meminfo.c | 3 +++ > include/linux/mmzone.h | 1 + > mm/vmstat.c | 1 + > 4 files changed, 9 insertions(+) > > diff --git a/drivers/base/node.c b/drivers/base/node.c > index bc9f43b..de261f5 100644 > --- a/drivers/base/node.c > +++ b/drivers/base/node.c > @@ -119,6 +119,7 @@ static ssize_t node_read_meminfo(struct device *dev, > "Node %d SUnreclaim: %8lu kB\n" > #ifdef CONFIG_TRANSPARENT_HUGEPAGE > "Node %d AnonHugePages: %8lu kB\n" > + "Node %d FileHugePages: %8lu kB\n" > #endif > , > nid, K(node_page_state(nid, NR_FILE_DIRTY)), > @@ -140,6 +141,9 @@ static ssize_t node_read_meminfo(struct device *dev, > nid, K(node_page_state(nid, NR_SLAB_UNRECLAIMABLE)) > , nid, > K(node_page_state(nid, > NR_ANON_TRANSPARENT_HUGEPAGES) * > + HPAGE_PMD_NR) > + , nid, > + K(node_page_state(nid, > NR_FILE_TRANSPARENT_HUGEPAGES) * > HPAGE_PMD_NR)); > #else > nid, K(node_page_state(nid, > NR_SLAB_UNRECLAIMABLE))); > diff --git a/fs/proc/meminfo.c b/fs/proc/meminfo.c > index 59d85d6..a62952c 100644 > --- a/fs/proc/meminfo.c > +++ b/fs/proc/meminfo.c > @@ -104,6 +104,7 @@ static int meminfo_proc_show(struct seq_file *m, void > *v) > #endif > #ifdef CONFIG_TRANSPARENT_HUGEPAGE > "AnonHugePages: %8lu kB\n" > + "FileHugePages: %8lu kB\n" > #endif > , > K(i.totalram), > @@ -158,6 +159,8 @@ static int meminfo_proc_show(struct seq_file *m, void > *v) > #ifdef CONFIG_TRANSPARENT_HUGEPAGE > ,K(global_page_state(NR_ANON_TRANSPARENT_HUGEPAGES) * > HPAGE_PMD_NR) > + ,K(global_page_state(NR_FILE_TRANSPARENT_HUGEPAGES) * > + HPAGE_PMD_NR) > #endif > ); > > diff --git a/include/linux/mmzone.h b/include/linux/mmzone.h > index 0c41d59..ba81833 100644 > --- a/include/linux/mmzone.h > +++ b/include/linux/mmzone.h > @@ -142,6 +142,7 @@ enum zone_stat_item { > NUMA_OTHER, /* allocation from other node */ > #endif > NR_ANON_TRANSPARENT_HUGEPAGES, > + NR_FILE_TRANSPARENT_HUGEPAGES, > NR_FREE_CMA_PAGES, > NR_VM_ZONE_STAT_ITEMS }; > > diff --git a/mm/vmstat.c b/mm/vmstat.c > index 87228c5..ffe3fbd 100644 > --- a/mm/vmstat.c > +++ b/mm/vmstat.c > @@ -739,6 +739,7 @@ const char * const vmstat_text[] = { > "numa_other", > #endif > "nr_anon_transparent_hugepages", > + "nr_file_transparent_hugepages", > "nr_free_cma", > "nr_dirty_threshold", > "nr_dirty_background_threshold", > -- > 1.8.3.2 > >