aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--arch/x86/mm/pageattr.c11
-rw-r--r--fs/proc/Makefile1
-rw-r--r--fs/proc/meminfo.c168
-rw-r--r--fs/proc/proc_misc.c137
-rw-r--r--include/asm-x86/pgtable.h3
-rw-r--r--include/linux/hugetlb.h6
-rw-r--r--mm/hugetlb.c5
7 files changed, 183 insertions, 148 deletions
diff --git a/arch/x86/mm/pageattr.c b/arch/x86/mm/pageattr.c
index 407d8784f669..f1dc1b75d166 100644
--- a/arch/x86/mm/pageattr.c
+++ b/arch/x86/mm/pageattr.c
@@ -65,23 +65,22 @@ static void split_page_count(int level)
65 direct_pages_count[level - 1] += PTRS_PER_PTE; 65 direct_pages_count[level - 1] += PTRS_PER_PTE;
66} 66}
67 67
68int arch_report_meminfo(char *page) 68void arch_report_meminfo(struct seq_file *m)
69{ 69{
70 int n = sprintf(page, "DirectMap4k: %8lu kB\n", 70 seq_printf(m, "DirectMap4k: %8lu kB\n",
71 direct_pages_count[PG_LEVEL_4K] << 2); 71 direct_pages_count[PG_LEVEL_4K] << 2);
72#if defined(CONFIG_X86_64) || defined(CONFIG_X86_PAE) 72#if defined(CONFIG_X86_64) || defined(CONFIG_X86_PAE)
73 n += sprintf(page + n, "DirectMap2M: %8lu kB\n", 73 seq_printf(m, "DirectMap2M: %8lu kB\n",
74 direct_pages_count[PG_LEVEL_2M] << 11); 74 direct_pages_count[PG_LEVEL_2M] << 11);
75#else 75#else
76 n += sprintf(page + n, "DirectMap4M: %8lu kB\n", 76 seq_printf(m, "DirectMap4M: %8lu kB\n",
77 direct_pages_count[PG_LEVEL_2M] << 12); 77 direct_pages_count[PG_LEVEL_2M] << 12);
78#endif 78#endif
79#ifdef CONFIG_X86_64 79#ifdef CONFIG_X86_64
80 if (direct_gbpages) 80 if (direct_gbpages)
81 n += sprintf(page + n, "DirectMap1G: %8lu kB\n", 81 seq_printf(m, "DirectMap1G: %8lu kB\n",
82 direct_pages_count[PG_LEVEL_1G] << 20); 82 direct_pages_count[PG_LEVEL_1G] << 20);
83#endif 83#endif
84 return n;
85} 84}
86#else 85#else
87static inline void split_page_count(int level) { } 86static inline void split_page_count(int level) { }
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},
diff --git a/include/asm-x86/pgtable.h b/include/asm-x86/pgtable.h
index 88a53b1a17f0..a3dda6d615be 100644
--- a/include/asm-x86/pgtable.h
+++ b/include/asm-x86/pgtable.h
@@ -348,7 +348,8 @@ static inline void native_pagetable_setup_start(pgd_t *base) {}
348static inline void native_pagetable_setup_done(pgd_t *base) {} 348static inline void native_pagetable_setup_done(pgd_t *base) {}
349#endif 349#endif
350 350
351extern int arch_report_meminfo(char *page); 351struct seq_file;
352extern void arch_report_meminfo(struct seq_file *m);
352 353
353#ifdef CONFIG_PARAVIRT 354#ifdef CONFIG_PARAVIRT
354#include <asm/paravirt.h> 355#include <asm/paravirt.h>
diff --git a/include/linux/hugetlb.h b/include/linux/hugetlb.h
index 32e0ef0f6e1f..e1c8afc002c0 100644
--- a/include/linux/hugetlb.h
+++ b/include/linux/hugetlb.h
@@ -27,7 +27,7 @@ void unmap_hugepage_range(struct vm_area_struct *,
27void __unmap_hugepage_range(struct vm_area_struct *, 27void __unmap_hugepage_range(struct vm_area_struct *,
28 unsigned long, unsigned long, struct page *); 28 unsigned long, unsigned long, struct page *);
29int hugetlb_prefault(struct address_space *, struct vm_area_struct *); 29int hugetlb_prefault(struct address_space *, struct vm_area_struct *);
30int hugetlb_report_meminfo(char *); 30void hugetlb_report_meminfo(struct seq_file *);
31int hugetlb_report_node_meminfo(int, char *); 31int hugetlb_report_node_meminfo(int, char *);
32unsigned long hugetlb_total_pages(void); 32unsigned long hugetlb_total_pages(void);
33int hugetlb_fault(struct mm_struct *mm, struct vm_area_struct *vma, 33int hugetlb_fault(struct mm_struct *mm, struct vm_area_struct *vma,
@@ -79,7 +79,9 @@ static inline unsigned long hugetlb_total_pages(void)
79#define copy_hugetlb_page_range(src, dst, vma) ({ BUG(); 0; }) 79#define copy_hugetlb_page_range(src, dst, vma) ({ BUG(); 0; })
80#define hugetlb_prefault(mapping, vma) ({ BUG(); 0; }) 80#define hugetlb_prefault(mapping, vma) ({ BUG(); 0; })
81#define unmap_hugepage_range(vma, start, end, page) BUG() 81#define unmap_hugepage_range(vma, start, end, page) BUG()
82#define hugetlb_report_meminfo(buf) 0 82static inline void hugetlb_report_meminfo(struct seq_file *m)
83{
84}
83#define hugetlb_report_node_meminfo(n, buf) 0 85#define hugetlb_report_node_meminfo(n, buf) 0
84#define follow_huge_pmd(mm, addr, pmd, write) NULL 86#define follow_huge_pmd(mm, addr, pmd, write) NULL
85#define follow_huge_pud(mm, addr, pud, write) NULL 87#define follow_huge_pud(mm, addr, pud, write) NULL
diff --git a/mm/hugetlb.c b/mm/hugetlb.c
index ce8cbb29860b..421aee99b84a 100644
--- a/mm/hugetlb.c
+++ b/mm/hugetlb.c
@@ -7,6 +7,7 @@
7#include <linux/init.h> 7#include <linux/init.h>
8#include <linux/module.h> 8#include <linux/module.h>
9#include <linux/mm.h> 9#include <linux/mm.h>
10#include <linux/seq_file.h>
10#include <linux/sysctl.h> 11#include <linux/sysctl.h>
11#include <linux/highmem.h> 12#include <linux/highmem.h>
12#include <linux/mmu_notifier.h> 13#include <linux/mmu_notifier.h>
@@ -1455,10 +1456,10 @@ int hugetlb_overcommit_handler(struct ctl_table *table, int write,
1455 1456
1456#endif /* CONFIG_SYSCTL */ 1457#endif /* CONFIG_SYSCTL */
1457 1458
1458int hugetlb_report_meminfo(char *buf) 1459void hugetlb_report_meminfo(struct seq_file *m)
1459{ 1460{
1460 struct hstate *h = &default_hstate; 1461 struct hstate *h = &default_hstate;
1461 return sprintf(buf, 1462 seq_printf(m,
1462 "HugePages_Total: %5lu\n" 1463 "HugePages_Total: %5lu\n"
1463 "HugePages_Free: %5lu\n" 1464 "HugePages_Free: %5lu\n"
1464 "HugePages_Rsvd: %5lu\n" 1465 "HugePages_Rsvd: %5lu\n"