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