void show_mem(void) { int free = 0, total = 0, reserved = 0; int shared = 0, cached = 0, slab = 0, node; printk("Mem-info:\n"); show_free_areas(); printk("Free swap: %6ldkB\n", nr_swap_pages<<(PAGE_SHIFT-10)); for_each_online_node(node) { struct page *page, *end; page = NODE_MEM_MAP(node); end = page + NODE_DATA(node)->node_spanned_pages; do { total++; if (PageReserved(page)) reserved++; else if (PageSwapCache(page)) cached++; else if (PageSlab(page)) slab++; else if (!page_count(page)) free++; else shared += page_count(page) - 1; page++; } while (page < end); } printk("%d pages of RAM\n", total); printk("%d free pages\n", free); printk("%d reserved pages\n", reserved); printk("%d slab pages\n", slab); printk("%d pages shared\n", shared); printk("%d pages swap cached\n", cached); }
static int memmap_read_proc(char *page, char **start, off_t off, int count, int *eof, void *data) { static int *bitmap = NULL; struct page *p, *end; int mark; int len = 0; int free = 0; int total = 0; int i, bit, start_pfn, end_pfn, array_size = 0; int array_bounds, pfn = 0; p = NODE_MEM_MAP(0); start_pfn = (int)page_to_pfn(p); end_pfn = start_pfn + num_physpages; end = pfn_to_page(end_pfn); array_size = end_pfn - start_pfn; array_bounds = array_size / BITS_PER_INT; if (bitmap == NULL) { bitmap = (unsigned int *)kmalloc(array_size / sizeof (int), GFP_KERNEL); } /* * one means used, zero means free, set them all to 1, * clear them as we find them free. */ for (i = 0; i < array_bounds; i++) { bitmap[i] = 0xffffffff; } total = free = 0; do { total++; pfn = page_to_pfn(p); if (!PageReserved(p) && page_count(p) == 0 && pfn_valid(pfn)) { i = pfn - start_pfn; bit = i % BITS_PER_INT; i /= BITS_PER_INT; free++; bitmap[i] &= ~(1<<bit); if (mem_acc_debug) printk("i %d bit %d pfn %d pa 0x%x c %d\n", index, bit, pfn, page_to_phys(p), page_count(p)); } p++; } while (p < end); mark = total - free; if (mark < lowwater) { lowwater = mark; } if (mark > highwater) { highwater = mark; } if (off == 0) { index = 0; len = sprintf(page, "High water used pages %d Low water used pages %d\n", highwater, lowwater); } else if (index == -1) { index = 0; *eof = 1; return 0; } for (index; index < array_bounds && len+ONE_LINE < count; index += 8) { len += sprintf(page + len, "%08x%08x%08x%08x%08x%08x%08x%08x\n", bitmap[index], bitmap[index + 1], bitmap[index + 2], bitmap[index + 3], bitmap[index + 4], bitmap[index + 5], bitmap[index + 6], bitmap[index + 7]); } if (index >= array_bounds || len > count) { index == -1; kfree(bitmap); bitmap = NULL; } *start = page; return len; }