summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorSong Liu <songliubraving@fb.com>2019-09-23 18:37:54 -0400
committerLinus Torvalds <torvalds@linux-foundation.org>2019-09-24 18:54:11 -0400
commit60fbf0ab5da1c360e02b7f7d882bf1c0d8f7e32a (patch)
tree5e7979e674bcea2e82e7863bc5a881f3de5733e3
parent520e5ba415906373186bcd3c7cffa3535bfdbdde (diff)
mm,thp: stats for file backed THP
In preparation for non-shmem THP, this patch adds a few stats and exposes them in /proc/meminfo, /sys/bus/node/devices/<node>/meminfo, and /proc/<pid>/task/<tid>/smaps. This patch is mostly a rewrite of Kirill A. Shutemov's earlier version: https://lkml.kernel.org/r/20170126115819.58875-5-kirill.shutemov@linux.intel.com/ Link: http://lkml.kernel.org/r/20190801184244.3169074-5-songliubraving@fb.com Signed-off-by: Song Liu <songliubraving@fb.com> Acked-by: Rik van Riel <riel@surriel.com> Acked-by: Kirill A. Shutemov <kirill.shutemov@linux.intel.com> Acked-by: Johannes Weiner <hannes@cmpxchg.org> Cc: Hillf Danton <hdanton@sina.com> Cc: Hugh Dickins <hughd@google.com> Cc: William Kucharski <william.kucharski@oracle.com> Cc: Oleg Nesterov <oleg@redhat.com> Signed-off-by: Andrew Morton <akpm@linux-foundation.org> Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
-rw-r--r--drivers/base/node.c6
-rw-r--r--fs/proc/meminfo.c4
-rw-r--r--fs/proc/task_mmu.c4
-rw-r--r--include/linux/mmzone.h2
-rw-r--r--mm/vmstat.c2
5 files changed, 17 insertions, 1 deletions
diff --git a/drivers/base/node.c b/drivers/base/node.c
index 257449cf061f..296546ffed6c 100644
--- a/drivers/base/node.c
+++ b/drivers/base/node.c
@@ -427,6 +427,8 @@ static ssize_t node_read_meminfo(struct device *dev,
427 "Node %d AnonHugePages: %8lu kB\n" 427 "Node %d AnonHugePages: %8lu kB\n"
428 "Node %d ShmemHugePages: %8lu kB\n" 428 "Node %d ShmemHugePages: %8lu kB\n"
429 "Node %d ShmemPmdMapped: %8lu kB\n" 429 "Node %d ShmemPmdMapped: %8lu kB\n"
430 "Node %d FileHugePages: %8lu kB\n"
431 "Node %d FilePmdMapped: %8lu kB\n"
430#endif 432#endif
431 , 433 ,
432 nid, K(node_page_state(pgdat, NR_FILE_DIRTY)), 434 nid, K(node_page_state(pgdat, NR_FILE_DIRTY)),
@@ -452,6 +454,10 @@ static ssize_t node_read_meminfo(struct device *dev,
452 nid, K(node_page_state(pgdat, NR_SHMEM_THPS) * 454 nid, K(node_page_state(pgdat, NR_SHMEM_THPS) *
453 HPAGE_PMD_NR), 455 HPAGE_PMD_NR),
454 nid, K(node_page_state(pgdat, NR_SHMEM_PMDMAPPED) * 456 nid, K(node_page_state(pgdat, NR_SHMEM_PMDMAPPED) *
457 HPAGE_PMD_NR),
458 nid, K(node_page_state(pgdat, NR_FILE_THPS) *
459 HPAGE_PMD_NR),
460 nid, K(node_page_state(pgdat, NR_FILE_PMDMAPPED) *
455 HPAGE_PMD_NR) 461 HPAGE_PMD_NR)
456#endif 462#endif
457 ); 463 );
diff --git a/fs/proc/meminfo.c b/fs/proc/meminfo.c
index 4bd80e68eb03..ac9247371871 100644
--- a/fs/proc/meminfo.c
+++ b/fs/proc/meminfo.c
@@ -132,6 +132,10 @@ static int meminfo_proc_show(struct seq_file *m, void *v)
132 global_node_page_state(NR_SHMEM_THPS) * HPAGE_PMD_NR); 132 global_node_page_state(NR_SHMEM_THPS) * HPAGE_PMD_NR);
133 show_val_kb(m, "ShmemPmdMapped: ", 133 show_val_kb(m, "ShmemPmdMapped: ",
134 global_node_page_state(NR_SHMEM_PMDMAPPED) * HPAGE_PMD_NR); 134 global_node_page_state(NR_SHMEM_PMDMAPPED) * HPAGE_PMD_NR);
135 show_val_kb(m, "FileHugePages: ",
136 global_node_page_state(NR_FILE_THPS) * HPAGE_PMD_NR);
137 show_val_kb(m, "FilePmdMapped: ",
138 global_node_page_state(NR_FILE_PMDMAPPED) * HPAGE_PMD_NR);
135#endif 139#endif
136 140
137#ifdef CONFIG_CMA 141#ifdef CONFIG_CMA
diff --git a/fs/proc/task_mmu.c b/fs/proc/task_mmu.c
index ea1630465474..9442631fd4af 100644
--- a/fs/proc/task_mmu.c
+++ b/fs/proc/task_mmu.c
@@ -417,6 +417,7 @@ struct mem_size_stats {
417 unsigned long lazyfree; 417 unsigned long lazyfree;
418 unsigned long anonymous_thp; 418 unsigned long anonymous_thp;
419 unsigned long shmem_thp; 419 unsigned long shmem_thp;
420 unsigned long file_thp;
420 unsigned long swap; 421 unsigned long swap;
421 unsigned long shared_hugetlb; 422 unsigned long shared_hugetlb;
422 unsigned long private_hugetlb; 423 unsigned long private_hugetlb;
@@ -588,7 +589,7 @@ static void smaps_pmd_entry(pmd_t *pmd, unsigned long addr,
588 else if (is_zone_device_page(page)) 589 else if (is_zone_device_page(page))
589 /* pass */; 590 /* pass */;
590 else 591 else
591 VM_BUG_ON_PAGE(1, page); 592 mss->file_thp += HPAGE_PMD_SIZE;
592 smaps_account(mss, page, true, pmd_young(*pmd), pmd_dirty(*pmd), locked); 593 smaps_account(mss, page, true, pmd_young(*pmd), pmd_dirty(*pmd), locked);
593} 594}
594#else 595#else
@@ -809,6 +810,7 @@ static void __show_smap(struct seq_file *m, const struct mem_size_stats *mss,
809 SEQ_PUT_DEC(" kB\nLazyFree: ", mss->lazyfree); 810 SEQ_PUT_DEC(" kB\nLazyFree: ", mss->lazyfree);
810 SEQ_PUT_DEC(" kB\nAnonHugePages: ", mss->anonymous_thp); 811 SEQ_PUT_DEC(" kB\nAnonHugePages: ", mss->anonymous_thp);
811 SEQ_PUT_DEC(" kB\nShmemPmdMapped: ", mss->shmem_thp); 812 SEQ_PUT_DEC(" kB\nShmemPmdMapped: ", mss->shmem_thp);
813 SEQ_PUT_DEC(" kB\nFilePmdMapped: ", mss->file_thp);
812 SEQ_PUT_DEC(" kB\nShared_Hugetlb: ", mss->shared_hugetlb); 814 SEQ_PUT_DEC(" kB\nShared_Hugetlb: ", mss->shared_hugetlb);
813 seq_put_decimal_ull_width(m, " kB\nPrivate_Hugetlb: ", 815 seq_put_decimal_ull_width(m, " kB\nPrivate_Hugetlb: ",
814 mss->private_hugetlb >> 10, 7); 816 mss->private_hugetlb >> 10, 7);
diff --git a/include/linux/mmzone.h b/include/linux/mmzone.h
index 3f38c30d2f13..aafb7c38c627 100644
--- a/include/linux/mmzone.h
+++ b/include/linux/mmzone.h
@@ -235,6 +235,8 @@ enum node_stat_item {
235 NR_SHMEM, /* shmem pages (included tmpfs/GEM pages) */ 235 NR_SHMEM, /* shmem pages (included tmpfs/GEM pages) */
236 NR_SHMEM_THPS, 236 NR_SHMEM_THPS,
237 NR_SHMEM_PMDMAPPED, 237 NR_SHMEM_PMDMAPPED,
238 NR_FILE_THPS,
239 NR_FILE_PMDMAPPED,
238 NR_ANON_THPS, 240 NR_ANON_THPS,
239 NR_UNSTABLE_NFS, /* NFS unstable pages */ 241 NR_UNSTABLE_NFS, /* NFS unstable pages */
240 NR_VMSCAN_WRITE, 242 NR_VMSCAN_WRITE,
diff --git a/mm/vmstat.c b/mm/vmstat.c
index fd7e16ca6996..6afc892a148a 100644
--- a/mm/vmstat.c
+++ b/mm/vmstat.c
@@ -1158,6 +1158,8 @@ const char * const vmstat_text[] = {
1158 "nr_shmem", 1158 "nr_shmem",
1159 "nr_shmem_hugepages", 1159 "nr_shmem_hugepages",
1160 "nr_shmem_pmdmapped", 1160 "nr_shmem_pmdmapped",
1161 "nr_file_hugepages",
1162 "nr_file_pmdmapped",
1161 "nr_anon_transparent_hugepages", 1163 "nr_anon_transparent_hugepages",
1162 "nr_unstable", 1164 "nr_unstable",
1163 "nr_vmscan_write", 1165 "nr_vmscan_write",