|
@@ -79,38 +79,37 @@ struct meminfo meminfo;
|
|
void show_mem(void)
|
|
void show_mem(void)
|
|
{
|
|
{
|
|
int free = 0, total = 0, reserved = 0;
|
|
int free = 0, total = 0, reserved = 0;
|
|
- int shared = 0, cached = 0, slab = 0, node, i;
|
|
|
|
|
|
+ int shared = 0, cached = 0, slab = 0, i;
|
|
struct meminfo * mi = &meminfo;
|
|
struct meminfo * mi = &meminfo;
|
|
|
|
|
|
printk("Mem-info:\n");
|
|
printk("Mem-info:\n");
|
|
show_free_areas();
|
|
show_free_areas();
|
|
- for_each_online_node(node) {
|
|
|
|
- for_each_nodebank (i,mi,node) {
|
|
|
|
- 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))
|
|
|
|
- free++;
|
|
|
|
- else
|
|
|
|
- shared += page_count(page) - 1;
|
|
|
|
- page++;
|
|
|
|
- } while (page < end);
|
|
|
|
- }
|
|
|
|
|
|
+
|
|
|
|
+ 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))
|
|
|
|
+ free++;
|
|
|
|
+ else
|
|
|
|
+ shared += page_count(page) - 1;
|
|
|
|
+ page++;
|
|
|
|
+ } while (page < end);
|
|
}
|
|
}
|
|
|
|
|
|
printk("%d pages of RAM\n", total);
|
|
printk("%d pages of RAM\n", total);
|
|
@@ -121,7 +120,7 @@ void show_mem(void)
|
|
printk("%d pages swap cached\n", cached);
|
|
printk("%d pages swap cached\n", cached);
|
|
}
|
|
}
|
|
|
|
|
|
-static void __init find_node_limits(int node, struct meminfo *mi,
|
|
|
|
|
|
+static void __init find_limits(struct meminfo *mi,
|
|
unsigned long *min, unsigned long *max_low, unsigned long *max_high)
|
|
unsigned long *min, unsigned long *max_low, unsigned long *max_high)
|
|
{
|
|
{
|
|
int i;
|
|
int i;
|
|
@@ -129,7 +128,7 @@ static void __init find_node_limits(int node, struct meminfo *mi,
|
|
*min = -1UL;
|
|
*min = -1UL;
|
|
*max_low = *max_high = 0;
|
|
*max_low = *max_high = 0;
|
|
|
|
|
|
- for_each_nodebank(i, mi, node) {
|
|
|
|
|
|
+ for_each_bank (i, mi) {
|
|
struct membank *bank = &mi->bank[i];
|
|
struct membank *bank = &mi->bank[i];
|
|
unsigned long start, end;
|
|
unsigned long start, end;
|
|
|
|
|
|
@@ -154,14 +153,14 @@ static void __init find_node_limits(int node, struct meminfo *mi,
|
|
* the end, we won't clash.
|
|
* the end, we won't clash.
|
|
*/
|
|
*/
|
|
static unsigned int __init
|
|
static unsigned int __init
|
|
-find_bootmap_pfn(int node, struct meminfo *mi, unsigned int bootmap_pages)
|
|
|
|
|
|
+find_bootmap_pfn(struct meminfo *mi, unsigned int bootmap_pages)
|
|
{
|
|
{
|
|
unsigned int start_pfn, i, bootmap_pfn;
|
|
unsigned int start_pfn, i, bootmap_pfn;
|
|
|
|
|
|
start_pfn = PAGE_ALIGN(__pa(_end)) >> PAGE_SHIFT;
|
|
start_pfn = PAGE_ALIGN(__pa(_end)) >> PAGE_SHIFT;
|
|
bootmap_pfn = 0;
|
|
bootmap_pfn = 0;
|
|
|
|
|
|
- for_each_nodebank(i, mi, node) {
|
|
|
|
|
|
+ for_each_bank(i, mi) {
|
|
struct membank *bank = &mi->bank[i];
|
|
struct membank *bank = &mi->bank[i];
|
|
unsigned int start, end;
|
|
unsigned int start, end;
|
|
|
|
|
|
@@ -191,7 +190,7 @@ find_bootmap_pfn(int node, struct meminfo *mi, unsigned int bootmap_pages)
|
|
|
|
|
|
static int __init check_initrd(struct meminfo *mi)
|
|
static int __init check_initrd(struct meminfo *mi)
|
|
{
|
|
{
|
|
- int initrd_node = -2;
|
|
|
|
|
|
+ int initrd = -2;
|
|
#ifdef CONFIG_BLK_DEV_INITRD
|
|
#ifdef CONFIG_BLK_DEV_INITRD
|
|
unsigned long end = phys_initrd_start + phys_initrd_size;
|
|
unsigned long end = phys_initrd_start + phys_initrd_size;
|
|
|
|
|
|
@@ -202,17 +201,17 @@ static int __init check_initrd(struct meminfo *mi)
|
|
if (phys_initrd_size) {
|
|
if (phys_initrd_size) {
|
|
unsigned int i;
|
|
unsigned int i;
|
|
|
|
|
|
- initrd_node = -1;
|
|
|
|
|
|
+ initrd = -1;
|
|
|
|
|
|
for (i = 0; i < mi->nr_banks; i++) {
|
|
for (i = 0; i < mi->nr_banks; i++) {
|
|
struct membank *bank = &mi->bank[i];
|
|
struct membank *bank = &mi->bank[i];
|
|
if (bank_phys_start(bank) <= phys_initrd_start &&
|
|
if (bank_phys_start(bank) <= phys_initrd_start &&
|
|
end <= bank_phys_end(bank))
|
|
end <= bank_phys_end(bank))
|
|
- initrd_node = bank->node;
|
|
|
|
|
|
+ initrd = 0;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
- if (initrd_node == -1) {
|
|
|
|
|
|
+ if (initrd == -1) {
|
|
printk(KERN_ERR "INITRD: 0x%08lx+0x%08lx extends beyond "
|
|
printk(KERN_ERR "INITRD: 0x%08lx+0x%08lx extends beyond "
|
|
"physical memory - disabling initrd\n",
|
|
"physical memory - disabling initrd\n",
|
|
phys_initrd_start, phys_initrd_size);
|
|
phys_initrd_start, phys_initrd_size);
|
|
@@ -220,10 +219,10 @@ static int __init check_initrd(struct meminfo *mi)
|
|
}
|
|
}
|
|
#endif
|
|
#endif
|
|
|
|
|
|
- return initrd_node;
|
|
|
|
|
|
+ return initrd;
|
|
}
|
|
}
|
|
|
|
|
|
-static void __init bootmem_init_node(int node, struct meminfo *mi,
|
|
|
|
|
|
+static void __init arm_bootmem_init(struct meminfo *mi,
|
|
unsigned long start_pfn, unsigned long end_pfn)
|
|
unsigned long start_pfn, unsigned long end_pfn)
|
|
{
|
|
{
|
|
unsigned long boot_pfn;
|
|
unsigned long boot_pfn;
|
|
@@ -235,37 +234,36 @@ static void __init bootmem_init_node(int node, struct meminfo *mi,
|
|
* Allocate the bootmem bitmap page.
|
|
* Allocate the bootmem bitmap page.
|
|
*/
|
|
*/
|
|
boot_pages = bootmem_bootmap_pages(end_pfn - start_pfn);
|
|
boot_pages = bootmem_bootmap_pages(end_pfn - start_pfn);
|
|
- boot_pfn = find_bootmap_pfn(node, mi, boot_pages);
|
|
|
|
|
|
+ boot_pfn = find_bootmap_pfn(mi, boot_pages);
|
|
|
|
|
|
/*
|
|
/*
|
|
- * Initialise the bootmem allocator for this node, handing the
|
|
|
|
|
|
+ * Initialise the bootmem allocator, handing the
|
|
* memory banks over to bootmem.
|
|
* memory banks over to bootmem.
|
|
*/
|
|
*/
|
|
- node_set_online(node);
|
|
|
|
- pgdat = NODE_DATA(node);
|
|
|
|
|
|
+ node_set_online(0);
|
|
|
|
+ pgdat = NODE_DATA(0);
|
|
init_bootmem_node(pgdat, boot_pfn, start_pfn, end_pfn);
|
|
init_bootmem_node(pgdat, boot_pfn, start_pfn, end_pfn);
|
|
|
|
|
|
- for_each_nodebank(i, mi, node) {
|
|
|
|
|
|
+ for_each_bank(i, mi) {
|
|
struct membank *bank = &mi->bank[i];
|
|
struct membank *bank = &mi->bank[i];
|
|
if (!bank->highmem)
|
|
if (!bank->highmem)
|
|
- free_bootmem_node(pgdat, bank_phys_start(bank), bank_phys_size(bank));
|
|
|
|
|
|
+ free_bootmem(bank_phys_start(bank), bank_phys_size(bank));
|
|
}
|
|
}
|
|
|
|
|
|
/*
|
|
/*
|
|
- * Reserve the bootmem bitmap for this node.
|
|
|
|
|
|
+ * Reserve the bootmem bitmap.
|
|
*/
|
|
*/
|
|
- reserve_bootmem_node(pgdat, boot_pfn << PAGE_SHIFT,
|
|
|
|
- boot_pages << PAGE_SHIFT, BOOTMEM_DEFAULT);
|
|
|
|
|
|
+ reserve_bootmem(boot_pfn << PAGE_SHIFT,
|
|
|
|
+ boot_pages << PAGE_SHIFT, BOOTMEM_DEFAULT);
|
|
}
|
|
}
|
|
|
|
|
|
-static void __init bootmem_reserve_initrd(int node)
|
|
|
|
|
|
+static void __init bootmem_reserve_initrd(void)
|
|
{
|
|
{
|
|
#ifdef CONFIG_BLK_DEV_INITRD
|
|
#ifdef CONFIG_BLK_DEV_INITRD
|
|
- pg_data_t *pgdat = NODE_DATA(node);
|
|
|
|
int res;
|
|
int res;
|
|
|
|
|
|
- res = reserve_bootmem_node(pgdat, phys_initrd_start,
|
|
|
|
- phys_initrd_size, BOOTMEM_EXCLUSIVE);
|
|
|
|
|
|
+ res = reserve_bootmem(phys_initrd_start,
|
|
|
|
+ phys_initrd_size, BOOTMEM_EXCLUSIVE);
|
|
|
|
|
|
if (res == 0) {
|
|
if (res == 0) {
|
|
initrd_start = __phys_to_virt(phys_initrd_start);
|
|
initrd_start = __phys_to_virt(phys_initrd_start);
|
|
@@ -279,23 +277,23 @@ static void __init bootmem_reserve_initrd(int node)
|
|
#endif
|
|
#endif
|
|
}
|
|
}
|
|
|
|
|
|
-static void __init bootmem_free_node(int node, struct meminfo *mi)
|
|
|
|
|
|
+static void __init arm_bootmem_free(struct meminfo *mi)
|
|
{
|
|
{
|
|
unsigned long zone_size[MAX_NR_ZONES], zhole_size[MAX_NR_ZONES];
|
|
unsigned long zone_size[MAX_NR_ZONES], zhole_size[MAX_NR_ZONES];
|
|
unsigned long min, max_low, max_high;
|
|
unsigned long min, max_low, max_high;
|
|
int i;
|
|
int i;
|
|
|
|
|
|
- find_node_limits(node, mi, &min, &max_low, &max_high);
|
|
|
|
|
|
+ find_limits(mi, &min, &max_low, &max_high);
|
|
|
|
|
|
/*
|
|
/*
|
|
- * initialise the zones within this node.
|
|
|
|
|
|
+ * initialise the zones.
|
|
*/
|
|
*/
|
|
memset(zone_size, 0, sizeof(zone_size));
|
|
memset(zone_size, 0, sizeof(zone_size));
|
|
|
|
|
|
/*
|
|
/*
|
|
- * The size of this node has already been determined. If we need
|
|
|
|
- * to do anything fancy with the allocation of this memory to the
|
|
|
|
- * zones, now is the time to do it.
|
|
|
|
|
|
+ * The memory size has already been determined. If we need
|
|
|
|
+ * to do anything fancy with the allocation of this memory
|
|
|
|
+ * to the zones, now is the time to do it.
|
|
*/
|
|
*/
|
|
zone_size[0] = max_low - min;
|
|
zone_size[0] = max_low - min;
|
|
#ifdef CONFIG_HIGHMEM
|
|
#ifdef CONFIG_HIGHMEM
|
|
@@ -303,11 +301,11 @@ static void __init bootmem_free_node(int node, struct meminfo *mi)
|
|
#endif
|
|
#endif
|
|
|
|
|
|
/*
|
|
/*
|
|
- * For each bank in this node, calculate the size of the holes.
|
|
|
|
- * holes = node_size - sum(bank_sizes_in_node)
|
|
|
|
|
|
+ * Calculate the size of the holes.
|
|
|
|
+ * holes = node_size - sum(bank_sizes)
|
|
*/
|
|
*/
|
|
memcpy(zhole_size, zone_size, sizeof(zhole_size));
|
|
memcpy(zhole_size, zone_size, sizeof(zhole_size));
|
|
- for_each_nodebank(i, mi, node) {
|
|
|
|
|
|
+ for_each_bank(i, mi) {
|
|
int idx = 0;
|
|
int idx = 0;
|
|
#ifdef CONFIG_HIGHMEM
|
|
#ifdef CONFIG_HIGHMEM
|
|
if (mi->bank[i].highmem)
|
|
if (mi->bank[i].highmem)
|
|
@@ -320,9 +318,9 @@ static void __init bootmem_free_node(int node, struct meminfo *mi)
|
|
* Adjust the sizes according to any special requirements for
|
|
* Adjust the sizes according to any special requirements for
|
|
* this machine type.
|
|
* this machine type.
|
|
*/
|
|
*/
|
|
- arch_adjust_zones(node, zone_size, zhole_size);
|
|
|
|
|
|
+ arch_adjust_zones(0, zone_size, zhole_size);
|
|
|
|
|
|
- free_area_init_node(node, zone_size, min, zhole_size);
|
|
|
|
|
|
+ free_area_init_node(0, zone_size, min, zhole_size);
|
|
}
|
|
}
|
|
|
|
|
|
#ifndef CONFIG_SPARSEMEM
|
|
#ifndef CONFIG_SPARSEMEM
|
|
@@ -346,16 +344,16 @@ int pfn_valid(unsigned long pfn)
|
|
}
|
|
}
|
|
EXPORT_SYMBOL(pfn_valid);
|
|
EXPORT_SYMBOL(pfn_valid);
|
|
|
|
|
|
-static void arm_memory_present(struct meminfo *mi, int node)
|
|
|
|
|
|
+static void arm_memory_present(struct meminfo *mi)
|
|
{
|
|
{
|
|
}
|
|
}
|
|
#else
|
|
#else
|
|
-static void arm_memory_present(struct meminfo *mi, int node)
|
|
|
|
|
|
+static void arm_memory_present(struct meminfo *mi)
|
|
{
|
|
{
|
|
int i;
|
|
int i;
|
|
- for_each_nodebank(i, mi, node) {
|
|
|
|
|
|
+ for_each_bank(i, mi) {
|
|
struct membank *bank = &mi->bank[i];
|
|
struct membank *bank = &mi->bank[i];
|
|
- memory_present(node, bank_pfn_start(bank), bank_pfn_end(bank));
|
|
|
|
|
|
+ memory_present(0, bank_pfn_start(bank), bank_pfn_end(bank));
|
|
}
|
|
}
|
|
}
|
|
}
|
|
#endif
|
|
#endif
|
|
@@ -364,55 +362,35 @@ void __init bootmem_init(void)
|
|
{
|
|
{
|
|
struct meminfo *mi = &meminfo;
|
|
struct meminfo *mi = &meminfo;
|
|
unsigned long min, max_low, max_high;
|
|
unsigned long min, max_low, max_high;
|
|
- int node, initrd_node;
|
|
|
|
|
|
+ int initrd;
|
|
|
|
|
|
/*
|
|
/*
|
|
- * Locate which node contains the ramdisk image, if any.
|
|
|
|
|
|
+ * Locate the ramdisk image, if any.
|
|
*/
|
|
*/
|
|
- initrd_node = check_initrd(mi);
|
|
|
|
|
|
+ initrd = check_initrd(mi);
|
|
|
|
|
|
max_low = max_high = 0;
|
|
max_low = max_high = 0;
|
|
|
|
|
|
- /*
|
|
|
|
- * Run through each node initialising the bootmem allocator.
|
|
|
|
- */
|
|
|
|
- for_each_node(node) {
|
|
|
|
- unsigned long node_low, node_high;
|
|
|
|
-
|
|
|
|
- find_node_limits(node, mi, &min, &node_low, &node_high);
|
|
|
|
|
|
+ find_limits(mi, &min, &max_low, &max_high);
|
|
|
|
|
|
- if (node_low > max_low)
|
|
|
|
- max_low = node_low;
|
|
|
|
- if (node_high > max_high)
|
|
|
|
- max_high = node_high;
|
|
|
|
|
|
+ arm_bootmem_init(mi, min, max_low);
|
|
|
|
|
|
- /*
|
|
|
|
- * If there is no memory in this node, ignore it.
|
|
|
|
- * (We can't have nodes which have no lowmem)
|
|
|
|
- */
|
|
|
|
- if (node_low == 0)
|
|
|
|
- continue;
|
|
|
|
-
|
|
|
|
- bootmem_init_node(node, mi, min, node_low);
|
|
|
|
-
|
|
|
|
- /*
|
|
|
|
- * Reserve any special node zero regions.
|
|
|
|
- */
|
|
|
|
- if (node == 0)
|
|
|
|
- reserve_node_zero(NODE_DATA(node));
|
|
|
|
|
|
+ /*
|
|
|
|
+ * Reserve any special regions.
|
|
|
|
+ */
|
|
|
|
+ reserve_special_regions();
|
|
|
|
|
|
- /*
|
|
|
|
- * If the initrd is in this node, reserve its memory.
|
|
|
|
- */
|
|
|
|
- if (node == initrd_node)
|
|
|
|
- bootmem_reserve_initrd(node);
|
|
|
|
|
|
+ /*
|
|
|
|
+ * If the initrd is present, reserve its memory.
|
|
|
|
+ */
|
|
|
|
+ if (initrd == 0)
|
|
|
|
+ bootmem_reserve_initrd();
|
|
|
|
|
|
- /*
|
|
|
|
- * Sparsemem tries to allocate bootmem in memory_present(),
|
|
|
|
- * so must be done after the fixed reservations
|
|
|
|
- */
|
|
|
|
- arm_memory_present(mi, node);
|
|
|
|
- }
|
|
|
|
|
|
+ /*
|
|
|
|
+ * Sparsemem tries to allocate bootmem in memory_present(),
|
|
|
|
+ * so must be done after the fixed reservations
|
|
|
|
+ */
|
|
|
|
+ arm_memory_present(mi);
|
|
|
|
|
|
/*
|
|
/*
|
|
* sparse_init() needs the bootmem allocator up and running.
|
|
* sparse_init() needs the bootmem allocator up and running.
|
|
@@ -420,12 +398,11 @@ void __init bootmem_init(void)
|
|
sparse_init();
|
|
sparse_init();
|
|
|
|
|
|
/*
|
|
/*
|
|
- * Now free memory in each node - free_area_init_node needs
|
|
|
|
|
|
+ * Now free the memory - free_area_init_node needs
|
|
* the sparse mem_map arrays initialized by sparse_init()
|
|
* the sparse mem_map arrays initialized by sparse_init()
|
|
* for memmap_init_zone(), otherwise all PFNs are invalid.
|
|
* for memmap_init_zone(), otherwise all PFNs are invalid.
|
|
*/
|
|
*/
|
|
- for_each_node(node)
|
|
|
|
- bootmem_free_node(node, mi);
|
|
|
|
|
|
+ arm_bootmem_free(mi);
|
|
|
|
|
|
high_memory = __va((max_low << PAGE_SHIFT) - 1) + 1;
|
|
high_memory = __va((max_low << PAGE_SHIFT) - 1) + 1;
|
|
|
|
|
|
@@ -460,7 +437,7 @@ static inline int free_area(unsigned long pfn, unsigned long end, char *s)
|
|
}
|
|
}
|
|
|
|
|
|
static inline void
|
|
static inline void
|
|
-free_memmap(int node, unsigned long start_pfn, unsigned long end_pfn)
|
|
|
|
|
|
+free_memmap(unsigned long start_pfn, unsigned long end_pfn)
|
|
{
|
|
{
|
|
struct page *start_pg, *end_pg;
|
|
struct page *start_pg, *end_pg;
|
|
unsigned long pg, pgend;
|
|
unsigned long pg, pgend;
|
|
@@ -483,13 +460,13 @@ free_memmap(int node, unsigned long start_pfn, unsigned long end_pfn)
|
|
* free the section of the memmap array.
|
|
* free the section of the memmap array.
|
|
*/
|
|
*/
|
|
if (pg < pgend)
|
|
if (pg < pgend)
|
|
- free_bootmem_node(NODE_DATA(node), pg, pgend - pg);
|
|
|
|
|
|
+ free_bootmem(pg, pgend - pg);
|
|
}
|
|
}
|
|
|
|
|
|
/*
|
|
/*
|
|
* The mem_map array can get very big. Free the unused area of the memory map.
|
|
* The mem_map array can get very big. Free the unused area of the memory map.
|
|
*/
|
|
*/
|
|
-static void __init free_unused_memmap_node(int node, struct meminfo *mi)
|
|
|
|
|
|
+static void __init free_unused_memmap(struct meminfo *mi)
|
|
{
|
|
{
|
|
unsigned long bank_start, prev_bank_end = 0;
|
|
unsigned long bank_start, prev_bank_end = 0;
|
|
unsigned int i;
|
|
unsigned int i;
|
|
@@ -499,7 +476,7 @@ static void __init free_unused_memmap_node(int node, struct meminfo *mi)
|
|
* may not be the case, especially if the user has provided the
|
|
* may not be the case, especially if the user has provided the
|
|
* information on the command line.
|
|
* information on the command line.
|
|
*/
|
|
*/
|
|
- for_each_nodebank(i, mi, node) {
|
|
|
|
|
|
+ for_each_bank(i, mi) {
|
|
struct membank *bank = &mi->bank[i];
|
|
struct membank *bank = &mi->bank[i];
|
|
|
|
|
|
bank_start = bank_pfn_start(bank);
|
|
bank_start = bank_pfn_start(bank);
|
|
@@ -514,7 +491,7 @@ static void __init free_unused_memmap_node(int node, struct meminfo *mi)
|
|
* between the current bank and the previous, free it.
|
|
* between the current bank and the previous, free it.
|
|
*/
|
|
*/
|
|
if (prev_bank_end && prev_bank_end != bank_start)
|
|
if (prev_bank_end && prev_bank_end != bank_start)
|
|
- free_memmap(node, prev_bank_end, bank_start);
|
|
|
|
|
|
+ free_memmap(prev_bank_end, bank_start);
|
|
|
|
|
|
prev_bank_end = bank_pfn_end(bank);
|
|
prev_bank_end = bank_pfn_end(bank);
|
|
}
|
|
}
|
|
@@ -528,21 +505,14 @@ static void __init free_unused_memmap_node(int node, struct meminfo *mi)
|
|
void __init mem_init(void)
|
|
void __init mem_init(void)
|
|
{
|
|
{
|
|
unsigned long reserved_pages, free_pages;
|
|
unsigned long reserved_pages, free_pages;
|
|
- int i, node;
|
|
|
|
|
|
+ int i;
|
|
|
|
|
|
-#ifndef CONFIG_DISCONTIGMEM
|
|
|
|
max_mapnr = pfn_to_page(max_pfn + PHYS_PFN_OFFSET) - mem_map;
|
|
max_mapnr = pfn_to_page(max_pfn + PHYS_PFN_OFFSET) - mem_map;
|
|
-#endif
|
|
|
|
|
|
|
|
/* this will put all unused low memory onto the freelists */
|
|
/* this will put all unused low memory onto the freelists */
|
|
- for_each_online_node(node) {
|
|
|
|
- pg_data_t *pgdat = NODE_DATA(node);
|
|
|
|
-
|
|
|
|
- free_unused_memmap_node(node, &meminfo);
|
|
|
|
|
|
+ free_unused_memmap(&meminfo);
|
|
|
|
|
|
- if (pgdat->node_spanned_pages != 0)
|
|
|
|
- totalram_pages += free_all_bootmem_node(pgdat);
|
|
|
|
- }
|
|
|
|
|
|
+ totalram_pages += free_all_bootmem();
|
|
|
|
|
|
#ifdef CONFIG_SA1111
|
|
#ifdef CONFIG_SA1111
|
|
/* now that our DMA memory is actually so designated, we can free it */
|
|
/* now that our DMA memory is actually so designated, we can free it */
|
|
@@ -552,39 +522,35 @@ void __init mem_init(void)
|
|
|
|
|
|
#ifdef CONFIG_HIGHMEM
|
|
#ifdef CONFIG_HIGHMEM
|
|
/* set highmem page free */
|
|
/* set highmem page free */
|
|
- for_each_online_node(node) {
|
|
|
|
- for_each_nodebank (i, &meminfo, node) {
|
|
|
|
- unsigned long start = bank_pfn_start(&meminfo.bank[i]);
|
|
|
|
- unsigned long end = bank_pfn_end(&meminfo.bank[i]);
|
|
|
|
- if (start >= max_low_pfn + PHYS_PFN_OFFSET)
|
|
|
|
- totalhigh_pages += free_area(start, end, NULL);
|
|
|
|
- }
|
|
|
|
|
|
+ for_each_bank (i, &meminfo) {
|
|
|
|
+ unsigned long start = bank_pfn_start(&meminfo.bank[i]);
|
|
|
|
+ unsigned long end = bank_pfn_end(&meminfo.bank[i]);
|
|
|
|
+ if (start >= max_low_pfn + PHYS_PFN_OFFSET)
|
|
|
|
+ totalhigh_pages += free_area(start, end, NULL);
|
|
}
|
|
}
|
|
totalram_pages += totalhigh_pages;
|
|
totalram_pages += totalhigh_pages;
|
|
#endif
|
|
#endif
|
|
|
|
|
|
reserved_pages = free_pages = 0;
|
|
reserved_pages = free_pages = 0;
|
|
|
|
|
|
- for_each_online_node(node) {
|
|
|
|
- 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 = pfn_to_page(pfn1);
|
|
|
|
- end = pfn_to_page(pfn2 - 1) + 1;
|
|
|
|
-
|
|
|
|
- do {
|
|
|
|
- if (PageReserved(page))
|
|
|
|
- reserved_pages++;
|
|
|
|
- else if (!page_count(page))
|
|
|
|
- free_pages++;
|
|
|
|
- page++;
|
|
|
|
- } while (page < end);
|
|
|
|
- }
|
|
|
|
|
|
+ for_each_bank(i, &meminfo) {
|
|
|
|
+ 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 = pfn_to_page(pfn1);
|
|
|
|
+ end = pfn_to_page(pfn2 - 1) + 1;
|
|
|
|
+
|
|
|
|
+ do {
|
|
|
|
+ if (PageReserved(page))
|
|
|
|
+ reserved_pages++;
|
|
|
|
+ else if (!page_count(page))
|
|
|
|
+ free_pages++;
|
|
|
|
+ page++;
|
|
|
|
+ } while (page < end);
|
|
}
|
|
}
|
|
|
|
|
|
/*
|
|
/*
|