summaryrefslogtreecommitdiff
path: root/fs/proc/sprd_debug/proc_phymem.c
diff options
context:
space:
mode:
Diffstat (limited to 'fs/proc/sprd_debug/proc_phymem.c')
-rw-r--r--fs/proc/sprd_debug/proc_phymem.c190
1 files changed, 190 insertions, 0 deletions
diff --git a/fs/proc/sprd_debug/proc_phymem.c b/fs/proc/sprd_debug/proc_phymem.c
new file mode 100644
index 00000000..2984a38e
--- /dev/null
+++ b/fs/proc/sprd_debug/proc_phymem.c
@@ -0,0 +1,190 @@
+#include <linux/module.h>
+#include <linux/swap.h>
+#include <linux/fs.h>
+#include <linux/init.h>
+#include <linux/kernel.h>
+#include <linux/errno.h>
+#include <linux/seq_file.h>
+#include <linux/proc_fs.h>
+#include <linux/mm.h>
+#include <linux/nmi.h>
+#include <linux/quicklist.h>
+#include <linux/vmalloc.h>
+#include <asm/setup.h>
+#include "../internal.h"
+
+#define K(x) ((x) << (PAGE_SHIFT - 10))
+
+extern struct meminfo meminfo;
+
+static struct proc_dir_entry* phymem;
+
+static int _phymem_map_proc_show(struct seq_file *m, void *v)
+{
+ int node, i, totalsize = 0;
+ struct meminfo *mi = &meminfo;
+
+ for_each_bank (i,mi) {
+ struct membank *bank = &mi->bank[i];
+ unsigned int pfn1, pfn2;
+ totalsize += bank->size;
+ seq_printf(m, "0x%08lx - 0x%08lx %lukB\n",
+ bank->start, bank->start + bank->size, bank->size/1024);
+ }
+ seq_printf(m, "linux total memory: %dkB\n", totalsize/1024);
+ return 0;
+}
+
+static int _phymem_pages_proc_show(struct seq_file *m, void *v)
+{
+ int free = 0, total = 0, reserved = 0;
+ int other = 0, shared = 0, cached = 0, slab = 0, node, i;
+
+ struct meminfo * mi = &meminfo;
+ for_each_bank (i,mi) {
+ struct membank *bank = &mi->bank[i];
+ unsigned int pfn1, pfn2;
+ struct page *page, *end;
+ pfn1 = bank_pfn_start(bank);
+ pfn2 = bank_pfn_end(bank);
+ page = pfn_to_page(pfn1);
+ end = pfn_to_page(pfn2 - 1) + 1;
+ do {
+ total++;
+ if (PageReserved(page))
+ reserved++;
+ else if (PageSwapCache(page))
+ cached++;
+ else if (PageSlab(page))
+ slab++;
+ else if (page_count(page) > 1)
+ shared++;
+ else if (!page_count(page))
+ free++;
+ else
+ other++;
+ page++;
+ }while (page < end);
+ }
+
+ seq_printf(m, "pages of RAM %d\n", total);
+ seq_printf(m, "free pages %d\n", free);
+ seq_printf(m, "reserved pages %d\n", reserved);
+ seq_printf(m, "slab pages %d\n", slab);
+ seq_printf(m, "pages shared %d\n", shared);
+ seq_printf(m, "pages swap cached %d\n", cached);
+ seq_printf(m, "other pages %d\n", other);
+ return 0;
+}
+
+#define MLK_ROUNDUP(b, t) b, t, DIV_ROUND_UP(((t) - (b)), SZ_1K)
+
+static int _phymem_dist_proc_show(struct seq_file *m, void *v)
+{
+ struct sysinfo sys_info;
+ int node, i, pfn = 0, linux_total_size = 0;
+ struct meminfo *mi = &meminfo;
+ long cached;
+ long kernelmem;
+ struct vmalloc_info vmi;
+ unsigned long pages[NR_LRU_LISTS];
+ int lru;
+
+ for_each_bank (i,mi) {
+ struct membank *bank = &mi->bank[i];
+ unsigned int pfn1, pfn2;
+ linux_total_size += bank->size;
+ pfn = bank_pfn_end(bank);
+ }
+
+ si_meminfo(&sys_info);
+ si_swapinfo(&sys_info);
+
+ cached = global_page_state(NR_FILE_PAGES) -
+ total_swapcache_pages() - sys_info.bufferram;
+ if (cached < 0)
+ cached = 0;
+
+ for (lru = LRU_BASE; lru < NR_LRU_LISTS; lru++)
+ pages[lru] = global_page_state(NR_LRU_BASE + lru);
+
+ kernelmem = K(sys_info.totalram - sys_info.freeram - sys_info.bufferram - pages[LRU_ACTIVE_ANON] \
+ - pages[LRU_INACTIVE_ANON] - cached - total_swapcache_pages());
+ get_vmalloc_info(&vmi);
+
+ seq_printf(m, "mem: %lukB\n", pfn*4);
+ seq_printf(m, " |--mem_other: %lukB\n", pfn*4 - linux_total_size/1024);
+ seq_printf(m, " |--mem_linux: %lukB\n", linux_total_size/1024);
+ seq_printf(m, " |--reserved: %lukB\n", linux_total_size/1024 - K(sys_info.totalram));
+ seq_printf(m, " |--mem_total: %lukB\n", K(sys_info.totalram));
+ seq_printf(m, " |--free: %lukB\n", K(sys_info.freeram));
+ seq_printf(m, " |--buffer: %lukB\n", K(sys_info.bufferram));
+ seq_printf(m, " |--cache: %lukB\n", K(cached));
+ seq_printf(m, " |--swapcache: %lukB\n", K(total_swapcache_pages()));
+ seq_printf(m, " |--user: %lukB\n", K(pages[LRU_ACTIVE_ANON] + pages[LRU_INACTIVE_ANON]));
+ seq_printf(m, " | |--active anon: %lukB\n", K(pages[LRU_ACTIVE_ANON]));
+ seq_printf(m, " | |--inactive anon: %lukB\n", K(pages[LRU_INACTIVE_ANON]));
+ seq_printf(m, " |--kernel: %lukB\n", kernelmem);
+ seq_printf(m, " |--stack: %lukB\n", global_page_state(NR_KERNEL_STACK) * THREAD_SIZE / 1024);
+ seq_printf(m, " |--slab: %lukB\n", K(global_page_state(NR_SLAB_RECLAIMABLE) +global_page_state(NR_SLAB_UNRECLAIMABLE)));
+ seq_printf(m, " |--pagetable: %lukB\n", K(global_page_state(NR_PAGETABLE)));
+ seq_printf(m, " |--vmalloc: %lukB\n",
+ kernelmem - global_page_state(NR_KERNEL_STACK) * THREAD_SIZE / 1024 \
+ - K(global_page_state(NR_SLAB_RECLAIMABLE) - global_page_state(NR_SLAB_UNRECLAIMABLE)) \
+ -K(global_page_state(NR_PAGETABLE)));
+ return 0;
+}
+
+
+static int _phymem_map_proc_open(struct inode* inode, struct file* file)
+{
+ single_open(file, _phymem_map_proc_show, NULL);
+ return 0;
+}
+
+static int _phymem_pages_proc_open(struct inode* inode, struct file* file)
+{
+ single_open(file, _phymem_pages_proc_show, NULL);
+ return 0;
+}
+
+static int _phymem_dist_proc_open(struct inode* inode, struct file* file)
+{
+ single_open(file, _phymem_dist_proc_show, NULL);
+ return 0;
+}
+
+static int _phymem_showmem_proc_show(struct file *filp, const char __user *buf, size_t len, loff_t *ppos)
+{
+ /* show_mem(); */
+ return 0;
+}
+
+struct file_operations phymem_map_proc_fops = {
+ .open = _phymem_map_proc_open,
+ .read = seq_read,
+ .llseek = seq_lseek,
+ .release = single_release,
+};
+
+struct file_operations phymem_pages_proc_fops = {
+ .open = _phymem_pages_proc_open,
+ .read = seq_read,
+ .llseek = seq_lseek,
+ .release = single_release,
+};
+
+struct file_operations phymem_dist_proc_fops = {
+ .open = _phymem_dist_proc_open,
+ .read = seq_read,
+ .llseek = seq_lseek,
+ .release = single_release,
+};
+
+struct file_operations phymem_showmem_proc_fops = {
+ .open = NULL,
+ .write = _phymem_showmem_proc_show,
+ .llseek = NULL,
+ .release = NULL,
+};
+