Commit 79134171df238171daa4c024a42b77b401ccb00b
Committed by
Linus Torvalds
1 parent
b9bbfbe30a
Exists in
master
and in
39 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); |