Commit 79134171df238171daa4c024a42b77b401ccb00b
Committed by
Linus Torvalds
1 parent
b9bbfbe30a
Exists in
master
and in
7 other branches
thp: transparent hugepage vmstat
Add hugepage stat information to /proc/vmstat and /proc/meminfo. Signed-off-by: Andrea Arcangeli <aarcange@redhat.com> Acked-by: Rik van Riel <riel@redhat.com> Signed-off-by: Andrew Morton <akpm@linux-foundation.org> Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
Showing 5 changed files with 34 additions and 5 deletions Side-by-side Diff
fs/proc/meminfo.c
| ... | ... | @@ -101,6 +101,9 @@ |
| 101 | 101 | #ifdef CONFIG_MEMORY_FAILURE |
| 102 | 102 | "HardwareCorrupted: %5lu kB\n" |
| 103 | 103 | #endif |
| 104 | +#ifdef CONFIG_TRANSPARENT_HUGEPAGE | |
| 105 | + "AnonHugePages: %8lu kB\n" | |
| 106 | +#endif | |
| 104 | 107 | , |
| 105 | 108 | K(i.totalram), |
| 106 | 109 | K(i.freeram), |
| ... | ... | @@ -128,7 +131,12 @@ |
| 128 | 131 | K(i.freeswap), |
| 129 | 132 | K(global_page_state(NR_FILE_DIRTY)), |
| 130 | 133 | K(global_page_state(NR_WRITEBACK)), |
| 131 | - K(global_page_state(NR_ANON_PAGES)), | |
| 134 | + K(global_page_state(NR_ANON_PAGES) | |
| 135 | +#ifdef CONFIG_TRANSPARENT_HUGEPAGE | |
| 136 | + + global_page_state(NR_ANON_TRANSPARENT_HUGEPAGES) * | |
| 137 | + HPAGE_PMD_NR | |
| 138 | +#endif | |
| 139 | + ), | |
| 132 | 140 | K(global_page_state(NR_FILE_MAPPED)), |
| 133 | 141 | K(global_page_state(NR_SHMEM)), |
| 134 | 142 | K(global_page_state(NR_SLAB_RECLAIMABLE) + |
| ... | ... | @@ -150,6 +158,10 @@ |
| 150 | 158 | vmi.largest_chunk >> 10 |
| 151 | 159 | #ifdef CONFIG_MEMORY_FAILURE |
| 152 | 160 | ,atomic_long_read(&mce_bad_pages) << (PAGE_SHIFT - 10) |
| 161 | +#endif | |
| 162 | +#ifdef CONFIG_TRANSPARENT_HUGEPAGE | |
| 163 | + ,K(global_page_state(NR_ANON_TRANSPARENT_HUGEPAGES) * | |
| 164 | + HPAGE_PMD_NR) | |
| 153 | 165 | #endif |
| 154 | 166 | ); |
| 155 | 167 |
include/linux/mmzone.h
mm/huge_memory.c
| ... | ... | @@ -751,6 +751,9 @@ |
| 751 | 751 | lru_add_page_tail(zone, page, page_tail); |
| 752 | 752 | } |
| 753 | 753 | |
| 754 | + __dec_zone_page_state(page, NR_ANON_TRANSPARENT_HUGEPAGES); | |
| 755 | + __mod_zone_page_state(zone, NR_ANON_PAGES, HPAGE_PMD_NR); | |
| 756 | + | |
| 754 | 757 | ClearPageCompound(page); |
| 755 | 758 | compound_unlock(page); |
| 756 | 759 | spin_unlock_irq(&zone->lru_lock); |
mm/rmap.c
| ... | ... | @@ -882,8 +882,13 @@ |
| 882 | 882 | struct vm_area_struct *vma, unsigned long address, int exclusive) |
| 883 | 883 | { |
| 884 | 884 | int first = atomic_inc_and_test(&page->_mapcount); |
| 885 | - if (first) | |
| 886 | - __inc_zone_page_state(page, NR_ANON_PAGES); | |
| 885 | + if (first) { | |
| 886 | + if (!PageTransHuge(page)) | |
| 887 | + __inc_zone_page_state(page, NR_ANON_PAGES); | |
| 888 | + else | |
| 889 | + __inc_zone_page_state(page, | |
| 890 | + NR_ANON_TRANSPARENT_HUGEPAGES); | |
| 891 | + } | |
| 887 | 892 | if (unlikely(PageKsm(page))) |
| 888 | 893 | return; |
| 889 | 894 | |
| ... | ... | @@ -911,7 +916,10 @@ |
| 911 | 916 | VM_BUG_ON(address < vma->vm_start || address >= vma->vm_end); |
| 912 | 917 | SetPageSwapBacked(page); |
| 913 | 918 | atomic_set(&page->_mapcount, 0); /* increment count (starts at -1) */ |
| 914 | - __inc_zone_page_state(page, NR_ANON_PAGES); | |
| 919 | + if (!PageTransHuge(page)) | |
| 920 | + __inc_zone_page_state(page, NR_ANON_PAGES); | |
| 921 | + else | |
| 922 | + __inc_zone_page_state(page, NR_ANON_TRANSPARENT_HUGEPAGES); | |
| 915 | 923 | __page_set_anon_rmap(page, vma, address, 1); |
| 916 | 924 | if (page_evictable(page, vma)) |
| 917 | 925 | lru_cache_add_lru(page, LRU_ACTIVE_ANON); |
| ... | ... | @@ -964,7 +972,11 @@ |
| 964 | 972 | return; |
| 965 | 973 | if (PageAnon(page)) { |
| 966 | 974 | mem_cgroup_uncharge_page(page); |
| 967 | - __dec_zone_page_state(page, NR_ANON_PAGES); | |
| 975 | + if (!PageTransHuge(page)) | |
| 976 | + __dec_zone_page_state(page, NR_ANON_PAGES); | |
| 977 | + else | |
| 978 | + __dec_zone_page_state(page, | |
| 979 | + NR_ANON_TRANSPARENT_HUGEPAGES); | |
| 968 | 980 | } else { |
| 969 | 981 | __dec_zone_page_state(page, NR_FILE_MAPPED); |
| 970 | 982 | mem_cgroup_update_file_mapped(page, -1); |