Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

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>

authored by

Song Liu and committed by
Linus Torvalds
60fbf0ab 520e5ba4

+17 -1
+6
drivers/base/node.c
··· 427 427 "Node %d AnonHugePages: %8lu kB\n" 428 428 "Node %d ShmemHugePages: %8lu kB\n" 429 429 "Node %d ShmemPmdMapped: %8lu kB\n" 430 + "Node %d FileHugePages: %8lu kB\n" 431 + "Node %d FilePmdMapped: %8lu kB\n" 430 432 #endif 431 433 , 432 434 nid, K(node_page_state(pgdat, NR_FILE_DIRTY)), ··· 454 452 nid, K(node_page_state(pgdat, NR_SHMEM_THPS) * 455 453 HPAGE_PMD_NR), 456 454 nid, K(node_page_state(pgdat, NR_SHMEM_PMDMAPPED) * 455 + HPAGE_PMD_NR), 456 + nid, K(node_page_state(pgdat, NR_FILE_THPS) * 457 + HPAGE_PMD_NR), 458 + nid, K(node_page_state(pgdat, NR_FILE_PMDMAPPED) * 457 459 HPAGE_PMD_NR) 458 460 #endif 459 461 );
+4
fs/proc/meminfo.c
··· 132 132 global_node_page_state(NR_SHMEM_THPS) * HPAGE_PMD_NR); 133 133 show_val_kb(m, "ShmemPmdMapped: ", 134 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 139 #endif 136 140 137 141 #ifdef CONFIG_CMA
+3 -1
fs/proc/task_mmu.c
··· 417 417 unsigned long lazyfree; 418 418 unsigned long anonymous_thp; 419 419 unsigned long shmem_thp; 420 + unsigned long file_thp; 420 421 unsigned long swap; 421 422 unsigned long shared_hugetlb; 422 423 unsigned long private_hugetlb; ··· 589 588 else if (is_zone_device_page(page)) 590 589 /* pass */; 591 590 else 592 - VM_BUG_ON_PAGE(1, page); 591 + mss->file_thp += HPAGE_PMD_SIZE; 593 592 smaps_account(mss, page, true, pmd_young(*pmd), pmd_dirty(*pmd), locked); 594 593 } 595 594 #else ··· 810 809 SEQ_PUT_DEC(" kB\nLazyFree: ", mss->lazyfree); 811 810 SEQ_PUT_DEC(" kB\nAnonHugePages: ", mss->anonymous_thp); 812 811 SEQ_PUT_DEC(" kB\nShmemPmdMapped: ", mss->shmem_thp); 812 + SEQ_PUT_DEC(" kB\nFilePmdMapped: ", mss->file_thp); 813 813 SEQ_PUT_DEC(" kB\nShared_Hugetlb: ", mss->shared_hugetlb); 814 814 seq_put_decimal_ull_width(m, " kB\nPrivate_Hugetlb: ", 815 815 mss->private_hugetlb >> 10, 7);
+2
include/linux/mmzone.h
··· 235 235 NR_SHMEM, /* shmem pages (included tmpfs/GEM pages) */ 236 236 NR_SHMEM_THPS, 237 237 NR_SHMEM_PMDMAPPED, 238 + NR_FILE_THPS, 239 + NR_FILE_PMDMAPPED, 238 240 NR_ANON_THPS, 239 241 NR_UNSTABLE_NFS, /* NFS unstable pages */ 240 242 NR_VMSCAN_WRITE,
+2
mm/vmstat.c
··· 1158 1158 "nr_shmem", 1159 1159 "nr_shmem_hugepages", 1160 1160 "nr_shmem_pmdmapped", 1161 + "nr_file_hugepages", 1162 + "nr_file_pmdmapped", 1161 1163 "nr_anon_transparent_hugepages", 1162 1164 "nr_unstable", 1163 1165 "nr_vmscan_write",