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