diff options
author | Song Liu <songliubraving@fb.com> | 2019-09-23 18:37:54 -0400 |
---|---|---|
committer | Linus Torvalds <torvalds@linux-foundation.org> | 2019-09-24 18:54:11 -0400 |
commit | 60fbf0ab5da1c360e02b7f7d882bf1c0d8f7e32a (patch) | |
tree | 5e7979e674bcea2e82e7863bc5a881f3de5733e3 | |
parent | 520e5ba415906373186bcd3c7cffa3535bfdbdde (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.c | 6 | ||||
-rw-r--r-- | fs/proc/meminfo.c | 4 | ||||
-rw-r--r-- | fs/proc/task_mmu.c | 4 | ||||
-rw-r--r-- | include/linux/mmzone.h | 2 | ||||
-rw-r--r-- | mm/vmstat.c | 2 |
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", |