aboutsummaryrefslogtreecommitdiffstats
path: root/fs
diff options
context:
space:
mode:
Diffstat (limited to 'fs')
-rw-r--r--fs/proc/Makefile1
-rw-r--r--fs/proc/meminfo.c168
-rw-r--r--fs/proc/proc_misc.c137
3 files changed, 169 insertions, 137 deletions
diff --git a/fs/proc/Makefile b/fs/proc/Makefile
index 27efa14963b1..70607a03839d 100644
--- a/fs/proc/Makefile
+++ b/fs/proc/Makefile
@@ -10,6 +10,7 @@ proc-$(CONFIG_MMU) := mmu.o task_mmu.o
10proc-y += inode.o root.o base.o generic.o array.o \ 10proc-y += inode.o root.o base.o generic.o array.o \
11 proc_tty.o proc_misc.o 11 proc_tty.o proc_misc.o
12proc-y += loadavg.o 12proc-y += loadavg.o
13proc-y += meminfo.o
13proc-y += uptime.o 14proc-y += uptime.o
14proc-$(CONFIG_PROC_SYSCTL) += proc_sysctl.o 15proc-$(CONFIG_PROC_SYSCTL) += proc_sysctl.o
15proc-$(CONFIG_NET) += proc_net.o 16proc-$(CONFIG_NET) += proc_net.o
diff --git a/fs/proc/meminfo.c b/fs/proc/meminfo.c
new file mode 100644
index 000000000000..b1675c4e66da
--- /dev/null
+++ b/fs/proc/meminfo.c
@@ -0,0 +1,168 @@
1#include <linux/fs.h>
2#include <linux/hugetlb.h>
3#include <linux/init.h>
4#include <linux/kernel.h>
5#include <linux/mm.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 <asm/atomic.h>
14#include <asm/page.h>
15#include <asm/pgtable.h>
16#include "internal.h"
17
18void __attribute__((weak)) arch_report_meminfo(struct seq_file *m)
19{
20}
21
22static int meminfo_proc_show(struct seq_file *m, void *v)
23{
24 struct sysinfo i;
25 unsigned long committed;
26 unsigned long allowed;
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 si_meminfo(&i);
37 si_swapinfo(&i);
38 committed = atomic_long_read(&vm_committed_space);
39 allowed = ((totalram_pages - hugetlb_total_pages())
40 * sysctl_overcommit_ratio / 100) + total_swap_pages;
41
42 cached = global_page_state(NR_FILE_PAGES) -
43 total_swapcache_pages - i.bufferram;
44 if (cached < 0)
45 cached = 0;
46
47 get_vmalloc_info(&vmi);
48
49 for (lru = LRU_BASE; lru < NR_LRU_LISTS; lru++)
50 pages[lru] = global_page_state(NR_LRU_BASE + lru);
51
52 /*
53 * Tagged format, for easy grepping and expansion.
54 */
55 seq_printf(m,
56 "MemTotal: %8lu kB\n"
57 "MemFree: %8lu kB\n"
58 "Buffers: %8lu kB\n"
59 "Cached: %8lu kB\n"
60 "SwapCached: %8lu kB\n"
61 "Active: %8lu kB\n"
62 "Inactive: %8lu kB\n"
63 "Active(anon): %8lu kB\n"
64 "Inactive(anon): %8lu kB\n"
65 "Active(file): %8lu kB\n"
66 "Inactive(file): %8lu kB\n"
67#ifdef CONFIG_UNEVICTABLE_LRU
68 "Unevictable: %8lu kB\n"
69 "Mlocked: %8lu kB\n"
70#endif
71#ifdef CONFIG_HIGHMEM
72 "HighTotal: %8lu kB\n"
73 "HighFree: %8lu kB\n"
74 "LowTotal: %8lu kB\n"
75 "LowFree: %8lu kB\n"
76#endif
77 "SwapTotal: %8lu kB\n"
78 "SwapFree: %8lu kB\n"
79 "Dirty: %8lu kB\n"
80 "Writeback: %8lu kB\n"
81 "AnonPages: %8lu kB\n"
82 "Mapped: %8lu kB\n"
83 "Slab: %8lu kB\n"
84 "SReclaimable: %8lu kB\n"
85 "SUnreclaim: %8lu kB\n"
86 "PageTables: %8lu kB\n"
87#ifdef CONFIG_QUICKLIST
88 "Quicklists: %8lu kB\n"
89#endif
90 "NFS_Unstable: %8lu kB\n"
91 "Bounce: %8lu kB\n"
92 "WritebackTmp: %8lu kB\n"
93 "CommitLimit: %8lu kB\n"
94 "Committed_AS: %8lu kB\n"
95 "VmallocTotal: %8lu kB\n"
96 "VmallocUsed: %8lu kB\n"
97 "VmallocChunk: %8lu kB\n",
98 K(i.totalram),
99 K(i.freeram),
100 K(i.bufferram),
101 K(cached),
102 K(total_swapcache_pages),
103 K(pages[LRU_ACTIVE_ANON] + pages[LRU_ACTIVE_FILE]),
104 K(pages[LRU_INACTIVE_ANON] + pages[LRU_INACTIVE_FILE]),
105 K(pages[LRU_ACTIVE_ANON]),
106 K(pages[LRU_INACTIVE_ANON]),
107 K(pages[LRU_ACTIVE_FILE]),
108 K(pages[LRU_INACTIVE_FILE]),
109#ifdef CONFIG_UNEVICTABLE_LRU
110 K(pages[LRU_UNEVICTABLE]),
111 K(global_page_state(NR_MLOCK)),
112#endif
113#ifdef CONFIG_HIGHMEM
114 K(i.totalhigh),
115 K(i.freehigh),
116 K(i.totalram-i.totalhigh),
117 K(i.freeram-i.freehigh),
118#endif
119 K(i.totalswap),
120 K(i.freeswap),
121 K(global_page_state(NR_FILE_DIRTY)),
122 K(global_page_state(NR_WRITEBACK)),
123 K(global_page_state(NR_ANON_PAGES)),
124 K(global_page_state(NR_FILE_MAPPED)),
125 K(global_page_state(NR_SLAB_RECLAIMABLE) +
126 global_page_state(NR_SLAB_UNRECLAIMABLE)),
127 K(global_page_state(NR_SLAB_RECLAIMABLE)),
128 K(global_page_state(NR_SLAB_UNRECLAIMABLE)),
129 K(global_page_state(NR_PAGETABLE)),
130#ifdef CONFIG_QUICKLIST
131 K(quicklist_total_size()),
132#endif
133 K(global_page_state(NR_UNSTABLE_NFS)),
134 K(global_page_state(NR_BOUNCE)),
135 K(global_page_state(NR_WRITEBACK_TEMP)),
136 K(allowed),
137 K(committed),
138 (unsigned long)VMALLOC_TOTAL >> 10,
139 vmi.used >> 10,
140 vmi.largest_chunk >> 10
141 );
142
143 hugetlb_report_meminfo(m);
144
145 arch_report_meminfo(m);
146
147 return 0;
148#undef K
149}
150
151static int meminfo_proc_open(struct inode *inode, struct file *file)
152{
153 return single_open(file, meminfo_proc_show, NULL);
154}
155
156static const struct file_operations meminfo_proc_fops = {
157 .open = meminfo_proc_open,
158 .read = seq_read,
159 .llseek = seq_lseek,
160 .release = single_release,
161};
162
163static int __init proc_meminfo_init(void)
164{
165 proc_create("meminfo", 0, NULL, &meminfo_proc_fops);
166 return 0;
167}
168module_init(proc_meminfo_init);
diff --git a/fs/proc/proc_misc.c b/fs/proc/proc_misc.c
index 484b6011bf0b..1aba51b0a0c4 100644
--- a/fs/proc/proc_misc.c
+++ b/fs/proc/proc_misc.c
@@ -78,142 +78,6 @@ static int proc_calc_metrics(char *page, char **start, off_t off,
78 return len; 78 return len;
79} 79}
80 80
81int __attribute__((weak)) arch_report_meminfo(char *page)
82{
83 return 0;
84}
85
86static int meminfo_read_proc(char *page, char **start, off_t off,
87 int count, int *eof, void *data)
88{
89 struct sysinfo i;
90 int len;
91 unsigned long committed;
92 unsigned long allowed;
93 struct vmalloc_info vmi;
94 long cached;
95 unsigned long pages[NR_LRU_LISTS];
96 int lru;
97
98/*
99 * display in kilobytes.
100 */
101#define K(x) ((x) << (PAGE_SHIFT - 10))
102 si_meminfo(&i);
103 si_swapinfo(&i);
104 committed = atomic_long_read(&vm_committed_space);
105 allowed = ((totalram_pages - hugetlb_total_pages())
106 * sysctl_overcommit_ratio / 100) + total_swap_pages;
107
108 cached = global_page_state(NR_FILE_PAGES) -
109 total_swapcache_pages - i.bufferram;
110 if (cached < 0)
111 cached = 0;
112
113 get_vmalloc_info(&vmi);
114
115 for (lru = LRU_BASE; lru < NR_LRU_LISTS; lru++)
116 pages[lru] = global_page_state(NR_LRU_BASE + lru);
117
118 /*
119 * Tagged format, for easy grepping and expansion.
120 */
121 len = sprintf(page,
122 "MemTotal: %8lu kB\n"
123 "MemFree: %8lu kB\n"
124 "Buffers: %8lu kB\n"
125 "Cached: %8lu kB\n"
126 "SwapCached: %8lu kB\n"
127 "Active: %8lu kB\n"
128 "Inactive: %8lu kB\n"
129 "Active(anon): %8lu kB\n"
130 "Inactive(anon): %8lu kB\n"
131 "Active(file): %8lu kB\n"
132 "Inactive(file): %8lu kB\n"
133#ifdef CONFIG_UNEVICTABLE_LRU
134 "Unevictable: %8lu kB\n"
135 "Mlocked: %8lu kB\n"
136#endif
137#ifdef CONFIG_HIGHMEM
138 "HighTotal: %8lu kB\n"
139 "HighFree: %8lu kB\n"
140 "LowTotal: %8lu kB\n"
141 "LowFree: %8lu kB\n"
142#endif
143 "SwapTotal: %8lu kB\n"
144 "SwapFree: %8lu kB\n"
145 "Dirty: %8lu kB\n"
146 "Writeback: %8lu kB\n"
147 "AnonPages: %8lu kB\n"
148 "Mapped: %8lu kB\n"
149 "Slab: %8lu kB\n"
150 "SReclaimable: %8lu kB\n"
151 "SUnreclaim: %8lu kB\n"
152 "PageTables: %8lu kB\n"
153#ifdef CONFIG_QUICKLIST
154 "Quicklists: %8lu kB\n"
155#endif
156 "NFS_Unstable: %8lu kB\n"
157 "Bounce: %8lu kB\n"
158 "WritebackTmp: %8lu kB\n"
159 "CommitLimit: %8lu kB\n"
160 "Committed_AS: %8lu kB\n"
161 "VmallocTotal: %8lu kB\n"
162 "VmallocUsed: %8lu kB\n"
163 "VmallocChunk: %8lu kB\n",
164 K(i.totalram),
165 K(i.freeram),
166 K(i.bufferram),
167 K(cached),
168 K(total_swapcache_pages),
169 K(pages[LRU_ACTIVE_ANON] + pages[LRU_ACTIVE_FILE]),
170 K(pages[LRU_INACTIVE_ANON] + pages[LRU_INACTIVE_FILE]),
171 K(pages[LRU_ACTIVE_ANON]),
172 K(pages[LRU_INACTIVE_ANON]),
173 K(pages[LRU_ACTIVE_FILE]),
174 K(pages[LRU_INACTIVE_FILE]),
175#ifdef CONFIG_UNEVICTABLE_LRU
176 K(pages[LRU_UNEVICTABLE]),
177 K(global_page_state(NR_MLOCK)),
178#endif
179#ifdef CONFIG_HIGHMEM
180 K(i.totalhigh),
181 K(i.freehigh),
182 K(i.totalram-i.totalhigh),
183 K(i.freeram-i.freehigh),
184#endif
185 K(i.totalswap),
186 K(i.freeswap),
187 K(global_page_state(NR_FILE_DIRTY)),
188 K(global_page_state(NR_WRITEBACK)),
189 K(global_page_state(NR_ANON_PAGES)),
190 K(global_page_state(NR_FILE_MAPPED)),
191 K(global_page_state(NR_SLAB_RECLAIMABLE) +
192 global_page_state(NR_SLAB_UNRECLAIMABLE)),
193 K(global_page_state(NR_SLAB_RECLAIMABLE)),
194 K(global_page_state(NR_SLAB_UNRECLAIMABLE)),
195 K(global_page_state(NR_PAGETABLE)),
196#ifdef CONFIG_QUICKLIST
197 K(quicklist_total_size()),
198#endif
199 K(global_page_state(NR_UNSTABLE_NFS)),
200 K(global_page_state(NR_BOUNCE)),
201 K(global_page_state(NR_WRITEBACK_TEMP)),
202 K(allowed),
203 K(committed),
204 (unsigned long)VMALLOC_TOTAL >> 10,
205 vmi.used >> 10,
206 vmi.largest_chunk >> 10
207 );
208
209 len += hugetlb_report_meminfo(page + len);
210
211 len += arch_report_meminfo(page + len);
212
213 return proc_calc_metrics(page, start, off, count, eof, len);
214#undef K
215}
216
217static int fragmentation_open(struct inode *inode, struct file *file) 81static int fragmentation_open(struct inode *inode, struct file *file)
218{ 82{
219 (void)inode; 83 (void)inode;
@@ -816,7 +680,6 @@ void __init proc_misc_init(void)
816 char *name; 680 char *name;
817 int (*read_proc)(char*,char**,off_t,int,int*,void*); 681 int (*read_proc)(char*,char**,off_t,int,int*,void*);
818 } *p, simple_ones[] = { 682 } *p, simple_ones[] = {
819 {"meminfo", meminfo_read_proc},
820 {"version", version_read_proc}, 683 {"version", version_read_proc},
821#ifdef CONFIG_PROC_HARDWARE 684#ifdef CONFIG_PROC_HARDWARE
822 {"hardware", hardware_read_proc}, 685 {"hardware", hardware_read_proc},