Branch data Line data Source code
1 : : #include <linux/fs.h>
2 : : #include <linux/init.h>
3 : : #include <linux/kernel.h>
4 : : #include <linux/mm.h>
5 : : #include <linux/hugetlb.h>
6 : : #include <linux/mman.h>
7 : : #include <linux/mmzone.h>
8 : : #include <linux/proc_fs.h>
9 : : #include <linux/quicklist.h>
10 : : #include <linux/seq_file.h>
11 : : #include <linux/swap.h>
12 : : #include <linux/vmstat.h>
13 : : #include <linux/atomic.h>
14 : : #include <linux/vmalloc.h>
15 : : #include <asm/page.h>
16 : : #include <asm/pgtable.h>
17 : : #include "internal.h"
18 : :
19 : 0 : void __attribute__((weak)) arch_report_meminfo(struct seq_file *m)
20 : : {
21 : 10045 : }
22 : :
23 : 0 : static int meminfo_proc_show(struct seq_file *m, void *v)
24 : : {
25 : : struct sysinfo i;
26 : : unsigned long committed;
27 : : struct vmalloc_info vmi;
28 : : long cached;
29 : : unsigned long pages[NR_LRU_LISTS];
30 : : int lru;
31 : :
32 : : /*
33 : : * display in kilobytes.
34 : : */
35 : : #define K(x) ((x) << (PAGE_SHIFT - 10))
36 : 10045 : si_meminfo(&i);
37 : 10045 : si_swapinfo(&i);
38 : 20090 : committed = percpu_counter_read_positive(&vm_committed_as);
39 : :
40 : 20090 : cached = global_page_state(NR_FILE_PAGES) -
41 : 10045 : total_swapcache_pages() - i.bufferram;
42 [ - + ]: 10045 : if (cached < 0)
43 : : cached = 0;
44 : :
45 : 10045 : get_vmalloc_info(&vmi);
46 : :
47 [ + + ]: 60270 : for (lru = LRU_BASE; lru < NR_LRU_LISTS; lru++)
48 : 100450 : pages[lru] = global_page_state(NR_LRU_BASE + lru);
49 : :
50 : : /*
51 : : * Tagged format, for easy grepping and expansion.
52 : : */
53 : 10045 : seq_printf(m,
54 : : "MemTotal: %8lu kB\n"
55 : : "MemFree: %8lu kB\n"
56 : : "Buffers: %8lu kB\n"
57 : : "Cached: %8lu kB\n"
58 : : "SwapCached: %8lu kB\n"
59 : : "Active: %8lu kB\n"
60 : : "Inactive: %8lu kB\n"
61 : : "Active(anon): %8lu kB\n"
62 : : "Inactive(anon): %8lu kB\n"
63 : : "Active(file): %8lu kB\n"
64 : : "Inactive(file): %8lu kB\n"
65 : : "Unevictable: %8lu kB\n"
66 : : "Mlocked: %8lu kB\n"
67 : : #ifdef CONFIG_HIGHMEM
68 : : "HighTotal: %8lu kB\n"
69 : : "HighFree: %8lu kB\n"
70 : : "LowTotal: %8lu kB\n"
71 : : "LowFree: %8lu kB\n"
72 : : #endif
73 : : #ifndef CONFIG_MMU
74 : : "MmapCopy: %8lu kB\n"
75 : : #endif
76 : : "SwapTotal: %8lu kB\n"
77 : : "SwapFree: %8lu kB\n"
78 : : "Dirty: %8lu kB\n"
79 : : "Writeback: %8lu kB\n"
80 : : "AnonPages: %8lu kB\n"
81 : : "Mapped: %8lu kB\n"
82 : : "Shmem: %8lu kB\n"
83 : : "Slab: %8lu kB\n"
84 : : "SReclaimable: %8lu kB\n"
85 : : "SUnreclaim: %8lu kB\n"
86 : : "KernelStack: %8lu kB\n"
87 : : "PageTables: %8lu kB\n"
88 : : #ifdef CONFIG_QUICKLIST
89 : : "Quicklists: %8lu kB\n"
90 : : #endif
91 : : "NFS_Unstable: %8lu kB\n"
92 : : "Bounce: %8lu kB\n"
93 : : "WritebackTmp: %8lu kB\n"
94 : : "CommitLimit: %8lu kB\n"
95 : : "Committed_AS: %8lu kB\n"
96 : : "VmallocTotal: %8lu kB\n"
97 : : "VmallocUsed: %8lu kB\n"
98 : : "VmallocChunk: %8lu kB\n"
99 : : #ifdef CONFIG_MEMORY_FAILURE
100 : : "HardwareCorrupted: %5lu kB\n"
101 : : #endif
102 : : #ifdef CONFIG_TRANSPARENT_HUGEPAGE
103 : : "AnonHugePages: %8lu kB\n"
104 : : #endif
105 : : ,
106 : 10045 : K(i.totalram),
107 : 10045 : K(i.freeram),
108 : 10045 : K(i.bufferram),
109 : : K(cached),
110 : 10045 : K(total_swapcache_pages()),
111 : 10045 : K(pages[LRU_ACTIVE_ANON] + pages[LRU_ACTIVE_FILE]),
112 : 10045 : K(pages[LRU_INACTIVE_ANON] + pages[LRU_INACTIVE_FILE]),
113 : : K(pages[LRU_ACTIVE_ANON]),
114 : : K(pages[LRU_INACTIVE_ANON]),
115 : : K(pages[LRU_ACTIVE_FILE]),
116 : : K(pages[LRU_INACTIVE_FILE]),
117 : 10045 : K(pages[LRU_UNEVICTABLE]),
118 : : K(global_page_state(NR_MLOCK)),
119 : : #ifdef CONFIG_HIGHMEM
120 : 10045 : K(i.totalhigh),
121 : 10045 : K(i.freehigh),
122 : 10045 : K(i.totalram-i.totalhigh),
123 : 10045 : K(i.freeram-i.freehigh),
124 : : #endif
125 : : #ifndef CONFIG_MMU
126 : : K((unsigned long) atomic_long_read(&mmap_pages_allocated)),
127 : : #endif
128 : 10045 : K(i.totalswap),
129 : 10045 : K(i.freeswap),
130 : : K(global_page_state(NR_FILE_DIRTY)),
131 : : K(global_page_state(NR_WRITEBACK)),
132 : : K(global_page_state(NR_ANON_PAGES)),
133 : : K(global_page_state(NR_FILE_MAPPED)),
134 : : K(global_page_state(NR_SHMEM)),
135 : 10045 : K(global_page_state(NR_SLAB_RECLAIMABLE) +
136 : : global_page_state(NR_SLAB_UNRECLAIMABLE)),
137 : : K(global_page_state(NR_SLAB_RECLAIMABLE)),
138 : : K(global_page_state(NR_SLAB_UNRECLAIMABLE)),
139 : 0 : global_page_state(NR_KERNEL_STACK) * THREAD_SIZE / 1024,
140 : : K(global_page_state(NR_PAGETABLE)),
141 : : #ifdef CONFIG_QUICKLIST
142 : : K(quicklist_total_size()),
143 : : #endif
144 : : K(global_page_state(NR_UNSTABLE_NFS)),
145 : : K(global_page_state(NR_BOUNCE)),
146 : : K(global_page_state(NR_WRITEBACK_TEMP)),
147 : 0 : K(vm_commit_limit()),
148 : : K(committed),
149 : 10045 : (unsigned long)VMALLOC_TOTAL >> 10,
150 : 10045 : vmi.used >> 10,
151 : 10045 : vmi.largest_chunk >> 10
152 : : #ifdef CONFIG_MEMORY_FAILURE
153 : : ,atomic_long_read(&num_poisoned_pages) << (PAGE_SHIFT - 10)
154 : : #endif
155 : : #ifdef CONFIG_TRANSPARENT_HUGEPAGE
156 : : ,K(global_page_state(NR_ANON_TRANSPARENT_HUGEPAGES) *
157 : : HPAGE_PMD_NR)
158 : : #endif
159 : : );
160 : :
161 : : hugetlb_report_meminfo(m);
162 : :
163 : 10045 : arch_report_meminfo(m);
164 : :
165 : 10045 : return 0;
166 : : #undef K
167 : : }
168 : :
169 : 0 : static int meminfo_proc_open(struct inode *inode, struct file *file)
170 : : {
171 : 10045 : return single_open(file, meminfo_proc_show, NULL);
172 : : }
173 : :
174 : : static const struct file_operations meminfo_proc_fops = {
175 : : .open = meminfo_proc_open,
176 : : .read = seq_read,
177 : : .llseek = seq_lseek,
178 : : .release = single_release,
179 : : };
180 : :
181 : 0 : static int __init proc_meminfo_init(void)
182 : : {
183 : : proc_create("meminfo", 0, NULL, &meminfo_proc_fops);
184 : 0 : return 0;
185 : : }
186 : : module_init(proc_meminfo_init);
|