forked from Minki/linux
proc: switch /proc/meminfo to seq_file
and move it to fs/proc/meminfo.c while I'm at it. Signed-off-by: Alexey Dobriyan <adobriyan@gmail.com>
This commit is contained in:
parent
9617760287
commit
e1759c215b
@ -65,23 +65,22 @@ static void split_page_count(int level)
|
||||
direct_pages_count[level - 1] += PTRS_PER_PTE;
|
||||
}
|
||||
|
||||
int arch_report_meminfo(char *page)
|
||||
void arch_report_meminfo(struct seq_file *m)
|
||||
{
|
||||
int n = sprintf(page, "DirectMap4k: %8lu kB\n",
|
||||
seq_printf(m, "DirectMap4k: %8lu kB\n",
|
||||
direct_pages_count[PG_LEVEL_4K] << 2);
|
||||
#if defined(CONFIG_X86_64) || defined(CONFIG_X86_PAE)
|
||||
n += sprintf(page + n, "DirectMap2M: %8lu kB\n",
|
||||
seq_printf(m, "DirectMap2M: %8lu kB\n",
|
||||
direct_pages_count[PG_LEVEL_2M] << 11);
|
||||
#else
|
||||
n += sprintf(page + n, "DirectMap4M: %8lu kB\n",
|
||||
seq_printf(m, "DirectMap4M: %8lu kB\n",
|
||||
direct_pages_count[PG_LEVEL_2M] << 12);
|
||||
#endif
|
||||
#ifdef CONFIG_X86_64
|
||||
if (direct_gbpages)
|
||||
n += sprintf(page + n, "DirectMap1G: %8lu kB\n",
|
||||
seq_printf(m, "DirectMap1G: %8lu kB\n",
|
||||
direct_pages_count[PG_LEVEL_1G] << 20);
|
||||
#endif
|
||||
return n;
|
||||
}
|
||||
#else
|
||||
static inline void split_page_count(int level) { }
|
||||
|
@ -10,6 +10,7 @@ proc-$(CONFIG_MMU) := mmu.o task_mmu.o
|
||||
proc-y += inode.o root.o base.o generic.o array.o \
|
||||
proc_tty.o proc_misc.o
|
||||
proc-y += loadavg.o
|
||||
proc-y += meminfo.o
|
||||
proc-y += uptime.o
|
||||
proc-$(CONFIG_PROC_SYSCTL) += proc_sysctl.o
|
||||
proc-$(CONFIG_NET) += proc_net.o
|
||||
|
168
fs/proc/meminfo.c
Normal file
168
fs/proc/meminfo.c
Normal file
@ -0,0 +1,168 @@
|
||||
#include <linux/fs.h>
|
||||
#include <linux/hugetlb.h>
|
||||
#include <linux/init.h>
|
||||
#include <linux/kernel.h>
|
||||
#include <linux/mm.h>
|
||||
#include <linux/mman.h>
|
||||
#include <linux/mmzone.h>
|
||||
#include <linux/proc_fs.h>
|
||||
#include <linux/quicklist.h>
|
||||
#include <linux/seq_file.h>
|
||||
#include <linux/swap.h>
|
||||
#include <linux/vmstat.h>
|
||||
#include <asm/atomic.h>
|
||||
#include <asm/page.h>
|
||||
#include <asm/pgtable.h>
|
||||
#include "internal.h"
|
||||
|
||||
void __attribute__((weak)) arch_report_meminfo(struct seq_file *m)
|
||||
{
|
||||
}
|
||||
|
||||
static int meminfo_proc_show(struct seq_file *m, void *v)
|
||||
{
|
||||
struct sysinfo i;
|
||||
unsigned long committed;
|
||||
unsigned long allowed;
|
||||
struct vmalloc_info vmi;
|
||||
long cached;
|
||||
unsigned long pages[NR_LRU_LISTS];
|
||||
int lru;
|
||||
|
||||
/*
|
||||
* display in kilobytes.
|
||||
*/
|
||||
#define K(x) ((x) << (PAGE_SHIFT - 10))
|
||||
si_meminfo(&i);
|
||||
si_swapinfo(&i);
|
||||
committed = atomic_long_read(&vm_committed_space);
|
||||
allowed = ((totalram_pages - hugetlb_total_pages())
|
||||
* sysctl_overcommit_ratio / 100) + total_swap_pages;
|
||||
|
||||
cached = global_page_state(NR_FILE_PAGES) -
|
||||
total_swapcache_pages - i.bufferram;
|
||||
if (cached < 0)
|
||||
cached = 0;
|
||||
|
||||
get_vmalloc_info(&vmi);
|
||||
|
||||
for (lru = LRU_BASE; lru < NR_LRU_LISTS; lru++)
|
||||
pages[lru] = global_page_state(NR_LRU_BASE + lru);
|
||||
|
||||
/*
|
||||
* Tagged format, for easy grepping and expansion.
|
||||
*/
|
||||
seq_printf(m,
|
||||
"MemTotal: %8lu kB\n"
|
||||
"MemFree: %8lu kB\n"
|
||||
"Buffers: %8lu kB\n"
|
||||
"Cached: %8lu kB\n"
|
||||
"SwapCached: %8lu kB\n"
|
||||
"Active: %8lu kB\n"
|
||||
"Inactive: %8lu kB\n"
|
||||
"Active(anon): %8lu kB\n"
|
||||
"Inactive(anon): %8lu kB\n"
|
||||
"Active(file): %8lu kB\n"
|
||||
"Inactive(file): %8lu kB\n"
|
||||
#ifdef CONFIG_UNEVICTABLE_LRU
|
||||
"Unevictable: %8lu kB\n"
|
||||
"Mlocked: %8lu kB\n"
|
||||
#endif
|
||||
#ifdef CONFIG_HIGHMEM
|
||||
"HighTotal: %8lu kB\n"
|
||||
"HighFree: %8lu kB\n"
|
||||
"LowTotal: %8lu kB\n"
|
||||
"LowFree: %8lu kB\n"
|
||||
#endif
|
||||
"SwapTotal: %8lu kB\n"
|
||||
"SwapFree: %8lu kB\n"
|
||||
"Dirty: %8lu kB\n"
|
||||
"Writeback: %8lu kB\n"
|
||||
"AnonPages: %8lu kB\n"
|
||||
"Mapped: %8lu kB\n"
|
||||
"Slab: %8lu kB\n"
|
||||
"SReclaimable: %8lu kB\n"
|
||||
"SUnreclaim: %8lu kB\n"
|
||||
"PageTables: %8lu kB\n"
|
||||
#ifdef CONFIG_QUICKLIST
|
||||
"Quicklists: %8lu kB\n"
|
||||
#endif
|
||||
"NFS_Unstable: %8lu kB\n"
|
||||
"Bounce: %8lu kB\n"
|
||||
"WritebackTmp: %8lu kB\n"
|
||||
"CommitLimit: %8lu kB\n"
|
||||
"Committed_AS: %8lu kB\n"
|
||||
"VmallocTotal: %8lu kB\n"
|
||||
"VmallocUsed: %8lu kB\n"
|
||||
"VmallocChunk: %8lu kB\n",
|
||||
K(i.totalram),
|
||||
K(i.freeram),
|
||||
K(i.bufferram),
|
||||
K(cached),
|
||||
K(total_swapcache_pages),
|
||||
K(pages[LRU_ACTIVE_ANON] + pages[LRU_ACTIVE_FILE]),
|
||||
K(pages[LRU_INACTIVE_ANON] + pages[LRU_INACTIVE_FILE]),
|
||||
K(pages[LRU_ACTIVE_ANON]),
|
||||
K(pages[LRU_INACTIVE_ANON]),
|
||||
K(pages[LRU_ACTIVE_FILE]),
|
||||
K(pages[LRU_INACTIVE_FILE]),
|
||||
#ifdef CONFIG_UNEVICTABLE_LRU
|
||||
K(pages[LRU_UNEVICTABLE]),
|
||||
K(global_page_state(NR_MLOCK)),
|
||||
#endif
|
||||
#ifdef CONFIG_HIGHMEM
|
||||
K(i.totalhigh),
|
||||
K(i.freehigh),
|
||||
K(i.totalram-i.totalhigh),
|
||||
K(i.freeram-i.freehigh),
|
||||
#endif
|
||||
K(i.totalswap),
|
||||
K(i.freeswap),
|
||||
K(global_page_state(NR_FILE_DIRTY)),
|
||||
K(global_page_state(NR_WRITEBACK)),
|
||||
K(global_page_state(NR_ANON_PAGES)),
|
||||
K(global_page_state(NR_FILE_MAPPED)),
|
||||
K(global_page_state(NR_SLAB_RECLAIMABLE) +
|
||||
global_page_state(NR_SLAB_UNRECLAIMABLE)),
|
||||
K(global_page_state(NR_SLAB_RECLAIMABLE)),
|
||||
K(global_page_state(NR_SLAB_UNRECLAIMABLE)),
|
||||
K(global_page_state(NR_PAGETABLE)),
|
||||
#ifdef CONFIG_QUICKLIST
|
||||
K(quicklist_total_size()),
|
||||
#endif
|
||||
K(global_page_state(NR_UNSTABLE_NFS)),
|
||||
K(global_page_state(NR_BOUNCE)),
|
||||
K(global_page_state(NR_WRITEBACK_TEMP)),
|
||||
K(allowed),
|
||||
K(committed),
|
||||
(unsigned long)VMALLOC_TOTAL >> 10,
|
||||
vmi.used >> 10,
|
||||
vmi.largest_chunk >> 10
|
||||
);
|
||||
|
||||
hugetlb_report_meminfo(m);
|
||||
|
||||
arch_report_meminfo(m);
|
||||
|
||||
return 0;
|
||||
#undef K
|
||||
}
|
||||
|
||||
static int meminfo_proc_open(struct inode *inode, struct file *file)
|
||||
{
|
||||
return single_open(file, meminfo_proc_show, NULL);
|
||||
}
|
||||
|
||||
static const struct file_operations meminfo_proc_fops = {
|
||||
.open = meminfo_proc_open,
|
||||
.read = seq_read,
|
||||
.llseek = seq_lseek,
|
||||
.release = single_release,
|
||||
};
|
||||
|
||||
static int __init proc_meminfo_init(void)
|
||||
{
|
||||
proc_create("meminfo", 0, NULL, &meminfo_proc_fops);
|
||||
return 0;
|
||||
}
|
||||
module_init(proc_meminfo_init);
|
@ -78,142 +78,6 @@ static int proc_calc_metrics(char *page, char **start, off_t off,
|
||||
return len;
|
||||
}
|
||||
|
||||
int __attribute__((weak)) arch_report_meminfo(char *page)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int meminfo_read_proc(char *page, char **start, off_t off,
|
||||
int count, int *eof, void *data)
|
||||
{
|
||||
struct sysinfo i;
|
||||
int len;
|
||||
unsigned long committed;
|
||||
unsigned long allowed;
|
||||
struct vmalloc_info vmi;
|
||||
long cached;
|
||||
unsigned long pages[NR_LRU_LISTS];
|
||||
int lru;
|
||||
|
||||
/*
|
||||
* display in kilobytes.
|
||||
*/
|
||||
#define K(x) ((x) << (PAGE_SHIFT - 10))
|
||||
si_meminfo(&i);
|
||||
si_swapinfo(&i);
|
||||
committed = atomic_long_read(&vm_committed_space);
|
||||
allowed = ((totalram_pages - hugetlb_total_pages())
|
||||
* sysctl_overcommit_ratio / 100) + total_swap_pages;
|
||||
|
||||
cached = global_page_state(NR_FILE_PAGES) -
|
||||
total_swapcache_pages - i.bufferram;
|
||||
if (cached < 0)
|
||||
cached = 0;
|
||||
|
||||
get_vmalloc_info(&vmi);
|
||||
|
||||
for (lru = LRU_BASE; lru < NR_LRU_LISTS; lru++)
|
||||
pages[lru] = global_page_state(NR_LRU_BASE + lru);
|
||||
|
||||
/*
|
||||
* Tagged format, for easy grepping and expansion.
|
||||
*/
|
||||
len = sprintf(page,
|
||||
"MemTotal: %8lu kB\n"
|
||||
"MemFree: %8lu kB\n"
|
||||
"Buffers: %8lu kB\n"
|
||||
"Cached: %8lu kB\n"
|
||||
"SwapCached: %8lu kB\n"
|
||||
"Active: %8lu kB\n"
|
||||
"Inactive: %8lu kB\n"
|
||||
"Active(anon): %8lu kB\n"
|
||||
"Inactive(anon): %8lu kB\n"
|
||||
"Active(file): %8lu kB\n"
|
||||
"Inactive(file): %8lu kB\n"
|
||||
#ifdef CONFIG_UNEVICTABLE_LRU
|
||||
"Unevictable: %8lu kB\n"
|
||||
"Mlocked: %8lu kB\n"
|
||||
#endif
|
||||
#ifdef CONFIG_HIGHMEM
|
||||
"HighTotal: %8lu kB\n"
|
||||
"HighFree: %8lu kB\n"
|
||||
"LowTotal: %8lu kB\n"
|
||||
"LowFree: %8lu kB\n"
|
||||
#endif
|
||||
"SwapTotal: %8lu kB\n"
|
||||
"SwapFree: %8lu kB\n"
|
||||
"Dirty: %8lu kB\n"
|
||||
"Writeback: %8lu kB\n"
|
||||
"AnonPages: %8lu kB\n"
|
||||
"Mapped: %8lu kB\n"
|
||||
"Slab: %8lu kB\n"
|
||||
"SReclaimable: %8lu kB\n"
|
||||
"SUnreclaim: %8lu kB\n"
|
||||
"PageTables: %8lu kB\n"
|
||||
#ifdef CONFIG_QUICKLIST
|
||||
"Quicklists: %8lu kB\n"
|
||||
#endif
|
||||
"NFS_Unstable: %8lu kB\n"
|
||||
"Bounce: %8lu kB\n"
|
||||
"WritebackTmp: %8lu kB\n"
|
||||
"CommitLimit: %8lu kB\n"
|
||||
"Committed_AS: %8lu kB\n"
|
||||
"VmallocTotal: %8lu kB\n"
|
||||
"VmallocUsed: %8lu kB\n"
|
||||
"VmallocChunk: %8lu kB\n",
|
||||
K(i.totalram),
|
||||
K(i.freeram),
|
||||
K(i.bufferram),
|
||||
K(cached),
|
||||
K(total_swapcache_pages),
|
||||
K(pages[LRU_ACTIVE_ANON] + pages[LRU_ACTIVE_FILE]),
|
||||
K(pages[LRU_INACTIVE_ANON] + pages[LRU_INACTIVE_FILE]),
|
||||
K(pages[LRU_ACTIVE_ANON]),
|
||||
K(pages[LRU_INACTIVE_ANON]),
|
||||
K(pages[LRU_ACTIVE_FILE]),
|
||||
K(pages[LRU_INACTIVE_FILE]),
|
||||
#ifdef CONFIG_UNEVICTABLE_LRU
|
||||
K(pages[LRU_UNEVICTABLE]),
|
||||
K(global_page_state(NR_MLOCK)),
|
||||
#endif
|
||||
#ifdef CONFIG_HIGHMEM
|
||||
K(i.totalhigh),
|
||||
K(i.freehigh),
|
||||
K(i.totalram-i.totalhigh),
|
||||
K(i.freeram-i.freehigh),
|
||||
#endif
|
||||
K(i.totalswap),
|
||||
K(i.freeswap),
|
||||
K(global_page_state(NR_FILE_DIRTY)),
|
||||
K(global_page_state(NR_WRITEBACK)),
|
||||
K(global_page_state(NR_ANON_PAGES)),
|
||||
K(global_page_state(NR_FILE_MAPPED)),
|
||||
K(global_page_state(NR_SLAB_RECLAIMABLE) +
|
||||
global_page_state(NR_SLAB_UNRECLAIMABLE)),
|
||||
K(global_page_state(NR_SLAB_RECLAIMABLE)),
|
||||
K(global_page_state(NR_SLAB_UNRECLAIMABLE)),
|
||||
K(global_page_state(NR_PAGETABLE)),
|
||||
#ifdef CONFIG_QUICKLIST
|
||||
K(quicklist_total_size()),
|
||||
#endif
|
||||
K(global_page_state(NR_UNSTABLE_NFS)),
|
||||
K(global_page_state(NR_BOUNCE)),
|
||||
K(global_page_state(NR_WRITEBACK_TEMP)),
|
||||
K(allowed),
|
||||
K(committed),
|
||||
(unsigned long)VMALLOC_TOTAL >> 10,
|
||||
vmi.used >> 10,
|
||||
vmi.largest_chunk >> 10
|
||||
);
|
||||
|
||||
len += hugetlb_report_meminfo(page + len);
|
||||
|
||||
len += arch_report_meminfo(page + len);
|
||||
|
||||
return proc_calc_metrics(page, start, off, count, eof, len);
|
||||
#undef K
|
||||
}
|
||||
|
||||
static int fragmentation_open(struct inode *inode, struct file *file)
|
||||
{
|
||||
(void)inode;
|
||||
@ -816,7 +680,6 @@ void __init proc_misc_init(void)
|
||||
char *name;
|
||||
int (*read_proc)(char*,char**,off_t,int,int*,void*);
|
||||
} *p, simple_ones[] = {
|
||||
{"meminfo", meminfo_read_proc},
|
||||
{"version", version_read_proc},
|
||||
#ifdef CONFIG_PROC_HARDWARE
|
||||
{"hardware", hardware_read_proc},
|
||||
|
@ -348,7 +348,8 @@ static inline void native_pagetable_setup_start(pgd_t *base) {}
|
||||
static inline void native_pagetable_setup_done(pgd_t *base) {}
|
||||
#endif
|
||||
|
||||
extern int arch_report_meminfo(char *page);
|
||||
struct seq_file;
|
||||
extern void arch_report_meminfo(struct seq_file *m);
|
||||
|
||||
#ifdef CONFIG_PARAVIRT
|
||||
#include <asm/paravirt.h>
|
||||
|
@ -27,7 +27,7 @@ void unmap_hugepage_range(struct vm_area_struct *,
|
||||
void __unmap_hugepage_range(struct vm_area_struct *,
|
||||
unsigned long, unsigned long, struct page *);
|
||||
int hugetlb_prefault(struct address_space *, struct vm_area_struct *);
|
||||
int hugetlb_report_meminfo(char *);
|
||||
void hugetlb_report_meminfo(struct seq_file *);
|
||||
int hugetlb_report_node_meminfo(int, char *);
|
||||
unsigned long hugetlb_total_pages(void);
|
||||
int hugetlb_fault(struct mm_struct *mm, struct vm_area_struct *vma,
|
||||
@ -79,7 +79,9 @@ static inline unsigned long hugetlb_total_pages(void)
|
||||
#define copy_hugetlb_page_range(src, dst, vma) ({ BUG(); 0; })
|
||||
#define hugetlb_prefault(mapping, vma) ({ BUG(); 0; })
|
||||
#define unmap_hugepage_range(vma, start, end, page) BUG()
|
||||
#define hugetlb_report_meminfo(buf) 0
|
||||
static inline void hugetlb_report_meminfo(struct seq_file *m)
|
||||
{
|
||||
}
|
||||
#define hugetlb_report_node_meminfo(n, buf) 0
|
||||
#define follow_huge_pmd(mm, addr, pmd, write) NULL
|
||||
#define follow_huge_pud(mm, addr, pud, write) NULL
|
||||
|
@ -7,6 +7,7 @@
|
||||
#include <linux/init.h>
|
||||
#include <linux/module.h>
|
||||
#include <linux/mm.h>
|
||||
#include <linux/seq_file.h>
|
||||
#include <linux/sysctl.h>
|
||||
#include <linux/highmem.h>
|
||||
#include <linux/mmu_notifier.h>
|
||||
@ -1455,10 +1456,10 @@ int hugetlb_overcommit_handler(struct ctl_table *table, int write,
|
||||
|
||||
#endif /* CONFIG_SYSCTL */
|
||||
|
||||
int hugetlb_report_meminfo(char *buf)
|
||||
void hugetlb_report_meminfo(struct seq_file *m)
|
||||
{
|
||||
struct hstate *h = &default_hstate;
|
||||
return sprintf(buf,
|
||||
seq_printf(m,
|
||||
"HugePages_Total: %5lu\n"
|
||||
"HugePages_Free: %5lu\n"
|
||||
"HugePages_Rsvd: %5lu\n"
|
||||
|
Loading…
Reference in New Issue
Block a user