From: "Kirill A. Shutemov" <kirill.shute...@linux.intel.com>

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.

Signed-off-by: Kirill A. Shutemov <kirill.shute...@linux.intel.com>
---
 drivers/base/node.c    |   10 ++++++++++
 fs/proc/meminfo.c      |    6 ++++++
 include/linux/mmzone.h |    1 +
 mm/mmap.c              |    3 +++
 mm/page_alloc.c        |    7 ++++++-
 5 files changed, 26 insertions(+), 1 deletion(-)

diff --git a/drivers/base/node.c b/drivers/base/node.c
index fac124a..eed3763 100644
--- a/drivers/base/node.c
+++ b/drivers/base/node.c
@@ -118,11 +118,18 @@ 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)),
                       nid, K(node_page_state(nid, NR_WRITEBACK)),
+#ifdef CONFIG_TRANSPARENT_HUGEPAGE
+                      nid, K(node_page_state(nid, NR_FILE_PAGES)
+                       + node_page_state(nid, NR_FILE_TRANSPARENT_HUGEPAGES) *
+                       HPAGE_PMD_NR),
+#else
                       nid, K(node_page_state(nid, NR_FILE_PAGES)),
+#endif
                       nid, K(node_page_state(nid, NR_FILE_MAPPED)),
 #ifdef CONFIG_TRANSPARENT_HUGEPAGE
                       nid, K(node_page_state(nid, NR_ANON_PAGES)
@@ -145,6 +152,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 1efaaa1..747ec70 100644
--- a/fs/proc/meminfo.c
+++ b/fs/proc/meminfo.c
@@ -41,6 +41,9 @@ static int meminfo_proc_show(struct seq_file *m, void *v)
 
        cached = global_page_state(NR_FILE_PAGES) -
                        total_swapcache_pages() - i.bufferram;
+       if (IS_ENABLED(CONFIG_TRANSPARENT_HUGEPAGE))
+               cached += global_page_state(NR_FILE_TRANSPARENT_HUGEPAGES) *
+                       HPAGE_PMD_NR;
        if (cached < 0)
                cached = 0;
 
@@ -103,6 +106,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),
@@ -163,6 +167,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 ab20a60..91fadd6 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/mmap.c b/mm/mmap.c
index 49dc7d5..afb9088 100644
--- a/mm/mmap.c
+++ b/mm/mmap.c
@@ -135,6 +135,9 @@ int __vm_enough_memory(struct mm_struct *mm, long pages, 
int cap_sys_admin)
        if (sysctl_overcommit_memory == OVERCOMMIT_GUESS) {
                free = global_page_state(NR_FREE_PAGES);
                free += global_page_state(NR_FILE_PAGES);
+               if (IS_ENABLED(CONFIG_TRANSPARENT_HUGEPAGE))
+                       free += global_page_state(NR_FILE_TRANSPARENT_HUGEPAGES)
+                               * HPAGE_PMD_NR;
 
                /*
                 * shmem pages shouldn't be counted as free in this
diff --git a/mm/page_alloc.c b/mm/page_alloc.c
index ca7b01e..7a26038 100644
--- a/mm/page_alloc.c
+++ b/mm/page_alloc.c
@@ -2963,6 +2963,7 @@ void show_free_areas(unsigned int filter)
 {
        int cpu;
        struct zone *zone;
+       long cached;
 
        for_each_populated_zone(zone) {
                if (skip_free_areas_node(filter, zone_to_nid(zone)))
@@ -3112,7 +3113,11 @@ void show_free_areas(unsigned int filter)
                printk("= %lukB\n", K(total));
        }
 
-       printk("%ld total pagecache pages\n", global_page_state(NR_FILE_PAGES));
+       cached = global_page_state(NR_FILE_PAGES);
+       if (IS_ENABLED(CONFIG_TRANSPARENT_HUGEPAGE))
+               cached += global_page_state(NR_FILE_TRANSPARENT_HUGEPAGES) *
+                       HPAGE_PMD_NR;
+       printk("%ld total pagecache pages\n", cached);
 
        show_swap_cache_info();
 }
-- 
1.7.10.4

--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/

Reply via email to