Commit 79134171df238171daa4c024a42b77b401ccb00b

Authored by Andrea Arcangeli
Committed by Linus Torvalds
1 parent b9bbfbe30a

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

... ... @@ -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
... ... @@ -114,6 +114,7 @@
114 114 NUMA_LOCAL, /* allocation from local node */
115 115 NUMA_OTHER, /* allocation from other node */
116 116 #endif
  117 + NR_ANON_TRANSPARENT_HUGEPAGES,
117 118 NR_VM_ZONE_STAT_ITEMS };
118 119  
119 120 /*
... ... @@ -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);
... ... @@ -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);
... ... @@ -880,6 +880,7 @@
880 880 "numa_local",
881 881 "numa_other",
882 882 #endif
  883 + "nr_anon_transparent_hugepages",
883 884 "nr_dirty_threshold",
884 885 "nr_dirty_background_threshold",
885 886