linux/fs/proc/meminfo.c
<<
>>
Prefs
   1#include <linux/fs.h>
   2#include <linux/init.h>
   3#include <linux/kernel.h>
   4#include <linux/mm.h>
   5#include <linux/hugetlb.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 <linux/atomic.h>
  14#include <linux/vmalloc.h>
  15#ifdef CONFIG_CMA
  16#include <linux/cma.h>
  17#endif
  18#include <asm/page.h>
  19#include <asm/pgtable.h>
  20#include "internal.h"
  21
  22void __attribute__((weak)) arch_report_meminfo(struct seq_file *m)
  23{
  24}
  25
  26static int meminfo_proc_show(struct seq_file *m, void *v)
  27{
  28        struct sysinfo i;
  29        unsigned long committed;
  30        long cached;
  31        long available;
  32        unsigned long pages[NR_LRU_LISTS];
  33        int lru;
  34
  35/*
  36 * display in kilobytes.
  37 */
  38#define K(x) ((x) << (PAGE_SHIFT - 10))
  39        si_meminfo(&i);
  40        si_swapinfo(&i);
  41        committed = percpu_counter_read_positive(&vm_committed_as);
  42
  43        cached = global_node_page_state(NR_FILE_PAGES) -
  44                        total_swapcache_pages() - i.bufferram;
  45        if (cached < 0)
  46                cached = 0;
  47
  48        for (lru = LRU_BASE; lru < NR_LRU_LISTS; lru++)
  49                pages[lru] = global_node_page_state(NR_LRU_BASE + lru);
  50
  51        available = si_mem_available();
  52
  53        /*
  54         * Tagged format, for easy grepping and expansion.
  55         */
  56        seq_printf(m,
  57                "MemTotal:       %8lu kB\n"
  58                "MemFree:        %8lu kB\n"
  59                "MemAvailable:   %8lu kB\n"
  60                "Buffers:        %8lu kB\n"
  61                "Cached:         %8lu kB\n"
  62                "SwapCached:     %8lu kB\n"
  63                "Active:         %8lu kB\n"
  64                "Inactive:       %8lu kB\n"
  65                "Active(anon):   %8lu kB\n"
  66                "Inactive(anon): %8lu kB\n"
  67                "Active(file):   %8lu kB\n"
  68                "Inactive(file): %8lu kB\n"
  69                "Unevictable:    %8lu kB\n"
  70                "Mlocked:        %8lu kB\n"
  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#ifndef CONFIG_MMU
  78                "MmapCopy:       %8lu kB\n"
  79#endif
  80                "SwapTotal:      %8lu kB\n"
  81                "SwapFree:       %8lu kB\n"
  82                "Dirty:          %8lu kB\n"
  83                "Writeback:      %8lu kB\n"
  84                "AnonPages:      %8lu kB\n"
  85                "Mapped:         %8lu kB\n"
  86                "Shmem:          %8lu kB\n"
  87                "Slab:           %8lu kB\n"
  88                "SReclaimable:   %8lu kB\n"
  89                "SUnreclaim:     %8lu kB\n"
  90                "KernelStack:    %8lu kB\n"
  91                "PageTables:     %8lu kB\n"
  92#ifdef CONFIG_QUICKLIST
  93                "Quicklists:     %8lu kB\n"
  94#endif
  95                "NFS_Unstable:   %8lu kB\n"
  96                "Bounce:         %8lu kB\n"
  97                "WritebackTmp:   %8lu kB\n"
  98                "CommitLimit:    %8lu kB\n"
  99                "Committed_AS:   %8lu kB\n"
 100                "VmallocTotal:   %8lu kB\n"
 101                "VmallocUsed:    %8lu kB\n"
 102                "VmallocChunk:   %8lu kB\n"
 103#ifdef CONFIG_MEMORY_FAILURE
 104                "HardwareCorrupted: %5lu kB\n"
 105#endif
 106#ifdef CONFIG_TRANSPARENT_HUGEPAGE
 107                "AnonHugePages:  %8lu kB\n"
 108                "ShmemHugePages: %8lu kB\n"
 109                "ShmemPmdMapped: %8lu kB\n"
 110#endif
 111#ifdef CONFIG_CMA
 112                "CmaTotal:       %8lu kB\n"
 113                "CmaFree:        %8lu kB\n"
 114#endif
 115                ,
 116                K(i.totalram),
 117                K(i.freeram),
 118                K(available),
 119                K(i.bufferram),
 120                K(cached),
 121                K(total_swapcache_pages()),
 122                K(pages[LRU_ACTIVE_ANON]   + pages[LRU_ACTIVE_FILE]),
 123                K(pages[LRU_INACTIVE_ANON] + pages[LRU_INACTIVE_FILE]),
 124                K(pages[LRU_ACTIVE_ANON]),
 125                K(pages[LRU_INACTIVE_ANON]),
 126                K(pages[LRU_ACTIVE_FILE]),
 127                K(pages[LRU_INACTIVE_FILE]),
 128                K(pages[LRU_UNEVICTABLE]),
 129                K(global_page_state(NR_MLOCK)),
 130#ifdef CONFIG_HIGHMEM
 131                K(i.totalhigh),
 132                K(i.freehigh),
 133                K(i.totalram-i.totalhigh),
 134                K(i.freeram-i.freehigh),
 135#endif
 136#ifndef CONFIG_MMU
 137                K((unsigned long) atomic_long_read(&mmap_pages_allocated)),
 138#endif
 139                K(i.totalswap),
 140                K(i.freeswap),
 141                K(global_node_page_state(NR_FILE_DIRTY)),
 142                K(global_node_page_state(NR_WRITEBACK)),
 143                K(global_node_page_state(NR_ANON_MAPPED)),
 144                K(global_node_page_state(NR_FILE_MAPPED)),
 145                K(i.sharedram),
 146                K(global_page_state(NR_SLAB_RECLAIMABLE) +
 147                                global_page_state(NR_SLAB_UNRECLAIMABLE)),
 148                K(global_page_state(NR_SLAB_RECLAIMABLE)),
 149                K(global_page_state(NR_SLAB_UNRECLAIMABLE)),
 150                global_page_state(NR_KERNEL_STACK_KB),
 151                K(global_page_state(NR_PAGETABLE)),
 152#ifdef CONFIG_QUICKLIST
 153                K(quicklist_total_size()),
 154#endif
 155                K(global_node_page_state(NR_UNSTABLE_NFS)),
 156                K(global_page_state(NR_BOUNCE)),
 157                K(global_node_page_state(NR_WRITEBACK_TEMP)),
 158                K(vm_commit_limit()),
 159                K(committed),
 160                (unsigned long)VMALLOC_TOTAL >> 10,
 161                0ul, // used to be vmalloc 'used'
 162                0ul  // used to be vmalloc 'largest_chunk'
 163#ifdef CONFIG_MEMORY_FAILURE
 164                , atomic_long_read(&num_poisoned_pages) << (PAGE_SHIFT - 10)
 165#endif
 166#ifdef CONFIG_TRANSPARENT_HUGEPAGE
 167                , K(global_node_page_state(NR_ANON_THPS) * HPAGE_PMD_NR)
 168                , K(global_node_page_state(NR_SHMEM_THPS) * HPAGE_PMD_NR)
 169                , K(global_node_page_state(NR_SHMEM_PMDMAPPED) * HPAGE_PMD_NR)
 170#endif
 171#ifdef CONFIG_CMA
 172                , K(totalcma_pages)
 173                , K(global_page_state(NR_FREE_CMA_PAGES))
 174#endif
 175                );
 176
 177        hugetlb_report_meminfo(m);
 178
 179        arch_report_meminfo(m);
 180
 181        return 0;
 182#undef K
 183}
 184
 185static int meminfo_proc_open(struct inode *inode, struct file *file)
 186{
 187        return single_open(file, meminfo_proc_show, NULL);
 188}
 189
 190static const struct file_operations meminfo_proc_fops = {
 191        .open           = meminfo_proc_open,
 192        .read           = seq_read,
 193        .llseek         = seq_lseek,
 194        .release        = single_release,
 195};
 196
 197static int __init proc_meminfo_init(void)
 198{
 199        proc_create("meminfo", 0, NULL, &meminfo_proc_fops);
 200        return 0;
 201}
 202fs_initcall(proc_meminfo_init);
 203