|
@@ -23,6 +23,7 @@
|
|
|
#include <asm/setup.h>
|
|
|
#include <asm/sizes.h>
|
|
|
#include <asm/tlb.h>
|
|
|
+#include <asm/fixmap.h>
|
|
|
|
|
|
#include <asm/mach/arch.h>
|
|
|
#include <asm/mach/map.h>
|
|
@@ -562,7 +563,7 @@ static void __init free_unused_memmap_node(int node, struct meminfo *mi)
|
|
|
*/
|
|
|
void __init mem_init(void)
|
|
|
{
|
|
|
- unsigned int codesize, datasize, initsize;
|
|
|
+ unsigned long reserved_pages, free_pages;
|
|
|
int i, node;
|
|
|
|
|
|
#ifndef CONFIG_DISCONTIGMEM
|
|
@@ -598,6 +599,33 @@ void __init mem_init(void)
|
|
|
totalram_pages += totalhigh_pages;
|
|
|
#endif
|
|
|
|
|
|
+ reserved_pages = free_pages = 0;
|
|
|
+
|
|
|
+ for_each_online_node(node) {
|
|
|
+ pg_data_t *n = NODE_DATA(node);
|
|
|
+ struct page *map = pgdat_page_nr(n, 0) - n->node_start_pfn;
|
|
|
+
|
|
|
+ for_each_nodebank(i, &meminfo, node) {
|
|
|
+ struct membank *bank = &meminfo.bank[i];
|
|
|
+ unsigned int pfn1, pfn2;
|
|
|
+ struct page *page, *end;
|
|
|
+
|
|
|
+ pfn1 = bank_pfn_start(bank);
|
|
|
+ pfn2 = bank_pfn_end(bank);
|
|
|
+
|
|
|
+ page = map + pfn1;
|
|
|
+ end = map + pfn2;
|
|
|
+
|
|
|
+ do {
|
|
|
+ if (PageReserved(page))
|
|
|
+ reserved_pages++;
|
|
|
+ else if (!page_count(page))
|
|
|
+ free_pages++;
|
|
|
+ page++;
|
|
|
+ } while (page < end);
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
/*
|
|
|
* Since our memory may not be contiguous, calculate the
|
|
|
* real number of pages we have in this system
|
|
@@ -610,16 +638,48 @@ void __init mem_init(void)
|
|
|
}
|
|
|
printk(" = %luMB total\n", num_physpages >> (20 - PAGE_SHIFT));
|
|
|
|
|
|
- codesize = _etext - _text;
|
|
|
- datasize = _end - _data;
|
|
|
- initsize = __init_end - __init_begin;
|
|
|
-
|
|
|
- printk(KERN_NOTICE "Memory: %luKB available (%dK code, "
|
|
|
- "%dK data, %dK init, %luK highmem)\n",
|
|
|
- nr_free_pages() << (PAGE_SHIFT-10), codesize >> 10,
|
|
|
- datasize >> 10, initsize >> 10,
|
|
|
+ printk(KERN_NOTICE "Memory: %luk/%luk available, %luk reserved, %luK highmem\n",
|
|
|
+ nr_free_pages() << (PAGE_SHIFT-10),
|
|
|
+ free_pages << (PAGE_SHIFT-10),
|
|
|
+ reserved_pages << (PAGE_SHIFT-10),
|
|
|
totalhigh_pages << (PAGE_SHIFT-10));
|
|
|
|
|
|
+#define MLK(b, t) b, t, ((t) - (b)) >> 10
|
|
|
+#define MLM(b, t) b, t, ((t) - (b)) >> 20
|
|
|
+#define MLK_ROUNDUP(b, t) b, t, DIV_ROUND_UP(((t) - (b)), SZ_1K)
|
|
|
+
|
|
|
+ printk(KERN_NOTICE "Virtual kernel memory layout:\n"
|
|
|
+ " vector : 0x%08lx - 0x%08lx (%4ld kB)\n"
|
|
|
+ " fixmap : 0x%08lx - 0x%08lx (%4ld kB)\n"
|
|
|
+ " vmalloc : 0x%08lx - 0x%08lx (%4ld MB)\n"
|
|
|
+ " lowmem : 0x%08lx - 0x%08lx (%4ld MB)\n"
|
|
|
+#ifdef CONFIG_HIGHMEM
|
|
|
+ " pkmap : 0x%08lx - 0x%08lx (%4ld MB)\n"
|
|
|
+#endif
|
|
|
+ " modules : 0x%08lx - 0x%08lx (%4ld MB)\n"
|
|
|
+ " .init : 0x%p" " - 0x%p" " (%4d kB)\n"
|
|
|
+ " .text : 0x%p" " - 0x%p" " (%4d kB)\n"
|
|
|
+ " .data : 0x%p" " - 0x%p" " (%4d kB)\n",
|
|
|
+
|
|
|
+ MLK(UL(CONFIG_VECTORS_BASE), UL(CONFIG_VECTORS_BASE) +
|
|
|
+ (PAGE_SIZE)),
|
|
|
+ MLK(FIXADDR_START, FIXADDR_TOP),
|
|
|
+ MLM(VMALLOC_START, (unsigned long)VMALLOC_END),
|
|
|
+ MLM(PAGE_OFFSET, (unsigned long)high_memory),
|
|
|
+#ifdef CONFIG_HIGHMEM
|
|
|
+ MLM(PKMAP_BASE, (PKMAP_BASE) + (LAST_PKMAP) *
|
|
|
+ (PAGE_SIZE)),
|
|
|
+#endif
|
|
|
+ MLM(MODULES_VADDR, MODULES_END),
|
|
|
+
|
|
|
+ MLK_ROUNDUP(__init_begin, __init_end),
|
|
|
+ MLK_ROUNDUP(_text, _etext),
|
|
|
+ MLK_ROUNDUP(_data, _edata));
|
|
|
+
|
|
|
+#undef MLK
|
|
|
+#undef MLM
|
|
|
+#undef MLK_ROUNDUP
|
|
|
+
|
|
|
if (PAGE_SIZE >= 16384 && num_physpages <= 128) {
|
|
|
extern int sysctl_overcommit_memory;
|
|
|
/*
|