Beispiel #1
0
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);
}
Beispiel #2
0
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;
}