]> git.karo-electronics.de Git - karo-tx-linux.git/commitdiff
mm, hugetlb: include hugepages in meminfo
authorDavid Rientjes <rientjes@google.com>
Tue, 26 Mar 2013 23:24:42 +0000 (10:24 +1100)
committerStephen Rothwell <sfr@canb.auug.org.au>
Thu, 4 Apr 2013 06:12:16 +0000 (17:12 +1100)
Particularly in oom conditions, it's troublesome that hugetlb memory is
not displayed.  All other meminfo that is emitted will not add up to what
is expected, and there is no artifact left in the kernel log to show that
a potentially significant amount of memory is actually allocated as
hugepages which are not available to be reclaimed.

Booting with hugepages=8192 on the command line, this memory is now shown
in oom conditions.  For example, with echo m > /proc/sysrq-trigger:

Node 0 hugepages_total=2048 hugepages_free=2048 hugepages_surp=0 hugepages_size=2048kB
Node 1 hugepages_total=2048 hugepages_free=2048 hugepages_surp=0 hugepages_size=2048kB
Node 2 hugepages_total=2048 hugepages_free=2048 hugepages_surp=0 hugepages_size=2048kB
Node 3 hugepages_total=2048 hugepages_free=2048 hugepages_surp=0 hugepages_size=2048kB

Signed-off-by: David Rientjes <rientjes@google.com>
Acked-by: Michal Hocko <mhocko@suse.cz>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
include/linux/hugetlb.h
mm/hugetlb.c
mm/page_alloc.c

index 16e4e9a643fb18a67ef73fb7f0feef5b074449a5..3a62df310f2effdd71317684589c9ff92570195e 100644 (file)
@@ -58,6 +58,7 @@ void __unmap_hugepage_range(struct mmu_gather *tlb, struct vm_area_struct *vma,
 int hugetlb_prefault(struct address_space *, struct vm_area_struct *);
 void hugetlb_report_meminfo(struct seq_file *);
 int hugetlb_report_node_meminfo(int, char *);
+void hugetlb_show_meminfo(void);
 unsigned long hugetlb_total_pages(void);
 int hugetlb_fault(struct mm_struct *mm, struct vm_area_struct *vma,
                        unsigned long address, unsigned int flags);
@@ -114,6 +115,9 @@ static inline void hugetlb_report_meminfo(struct seq_file *m)
 {
 }
 #define hugetlb_report_node_meminfo(n, buf)    0
+static inline void hugetlb_show_meminfo(void)
+{
+}
 #define follow_huge_pmd(mm, addr, pmd, write)  NULL
 #define follow_huge_pud(mm, addr, pud, write)  NULL
 #define prepare_hugepage_range(file, addr, len)        (-EINVAL)
index a333350dfe03d4c1157f68ff09a5319330fba9c1..406ce411792b1b0ec19039dac61130f7bbc3a86b 100644 (file)
@@ -2121,6 +2121,21 @@ int hugetlb_report_node_meminfo(int nid, char *buf)
                nid, h->surplus_huge_pages_node[nid]);
 }
 
+void hugetlb_show_meminfo(void)
+{
+       struct hstate *h;
+       int nid;
+
+       for_each_node_state(nid, N_MEMORY)
+               for_each_hstate(h)
+                       pr_info("Node %d hugepages_total=%u hugepages_free=%u hugepages_surp=%u hugepages_size=%lukB\n",
+                               nid,
+                               h->nr_huge_pages_node[nid],
+                               h->free_huge_pages_node[nid],
+                               h->surplus_huge_pages_node[nid],
+                               1UL << (huge_page_order(h) + PAGE_SHIFT - 10));
+}
+
 /* Return the number pages of memory we physically have, in PAGE_SIZE units. */
 unsigned long hugetlb_total_pages(void)
 {
index 72da11c6804d203e38d77d2cd7688b9dd73fcdd2..7350986bbf9966439102e5861c006965d110eace 100644 (file)
@@ -58,6 +58,7 @@
 #include <linux/prefetch.h>
 #include <linux/migrate.h>
 #include <linux/page-debug-flags.h>
+#include <linux/hugetlb.h>
 #include <linux/sched/rt.h>
 
 #include <asm/tlbflush.h>
@@ -3113,6 +3114,8 @@ void show_free_areas(unsigned int filter)
                printk("= %lukB\n", K(total));
        }
 
+       hugetlb_show_meminfo();
+
        printk("%ld total pagecache pages\n", global_page_state(NR_FILE_PAGES));
 
        show_swap_cache_info();