diff options
Diffstat (limited to 'arch/sparc/mm/init_64.c')
| -rw-r--r-- | arch/sparc/mm/init_64.c | 121 | 
1 files changed, 21 insertions, 100 deletions
diff --git a/arch/sparc/mm/init_64.c b/arch/sparc/mm/init_64.c index 21faaeea85d..6026fdd1b2e 100644 --- a/arch/sparc/mm/init_64.c +++ b/arch/sparc/mm/init_64.c @@ -741,7 +741,6 @@ static void __init find_ramdisk(unsigned long phys_base)  struct node_mem_mask {  	unsigned long mask;  	unsigned long val; -	unsigned long bootmem_paddr;  };  static struct node_mem_mask node_masks[MAX_NUMNODES];  static int num_node_masks; @@ -806,12 +805,6 @@ static u64 memblock_nid_range(u64 start, u64 end, int *nid)  	return start;  } -#else -static u64 memblock_nid_range(u64 start, u64 end, int *nid) -{ -	*nid = 0; -	return end; -}  #endif  /* This must be invoked after performing all of the necessary @@ -820,10 +813,11 @@ static u64 memblock_nid_range(u64 start, u64 end, int *nid)   */  static void __init allocate_node_data(int nid)  { -	unsigned long paddr, num_pages, start_pfn, end_pfn;  	struct pglist_data *p; - +	unsigned long start_pfn, end_pfn;  #ifdef CONFIG_NEED_MULTIPLE_NODES +	unsigned long paddr; +  	paddr = memblock_alloc_try_nid(sizeof(struct pglist_data), SMP_CACHE_BYTES, nid);  	if (!paddr) {  		prom_printf("Cannot allocate pglist_data for nid[%d]\n", nid); @@ -832,7 +826,7 @@ static void __init allocate_node_data(int nid)  	NODE_DATA(nid) = __va(paddr);  	memset(NODE_DATA(nid), 0, sizeof(struct pglist_data)); -	NODE_DATA(nid)->bdata = &bootmem_node_data[nid]; +	NODE_DATA(nid)->node_id = nid;  #endif  	p = NODE_DATA(nid); @@ -840,18 +834,6 @@ static void __init allocate_node_data(int nid)  	get_pfn_range_for_nid(nid, &start_pfn, &end_pfn);  	p->node_start_pfn = start_pfn;  	p->node_spanned_pages = end_pfn - start_pfn; - -	if (p->node_spanned_pages) { -		num_pages = bootmem_bootmap_pages(p->node_spanned_pages); - -		paddr = memblock_alloc_try_nid(num_pages << PAGE_SHIFT, PAGE_SIZE, nid); -		if (!paddr) { -			prom_printf("Cannot allocate bootmap for nid[%d]\n", -				  nid); -			prom_halt(); -		} -		node_masks[nid].bootmem_paddr = paddr; -	}  }  static void init_node_masks_nonnuma(void) @@ -1292,75 +1274,9 @@ static void __init bootmem_init_nonnuma(void)  	node_set_online(0);  } -static void __init reserve_range_in_node(int nid, unsigned long start, -					 unsigned long end) -{ -	numadbg("    reserve_range_in_node(nid[%d],start[%lx],end[%lx]\n", -		nid, start, end); -	while (start < end) { -		unsigned long this_end; -		int n; - -		this_end = memblock_nid_range(start, end, &n); -		if (n == nid) { -			numadbg("      MATCH reserving range [%lx:%lx]\n", -				start, this_end); -			reserve_bootmem_node(NODE_DATA(nid), start, -					     (this_end - start), BOOTMEM_DEFAULT); -		} else -			numadbg("      NO MATCH, advancing start to %lx\n", -				this_end); - -		start = this_end; -	} -} - -static void __init trim_reserved_in_node(int nid) -{ -	struct memblock_region *reg; - -	numadbg("  trim_reserved_in_node(%d)\n", nid); - -	for_each_memblock(reserved, reg) -		reserve_range_in_node(nid, reg->base, reg->base + reg->size); -} - -static void __init bootmem_init_one_node(int nid) -{ -	struct pglist_data *p; - -	numadbg("bootmem_init_one_node(%d)\n", nid); - -	p = NODE_DATA(nid); - -	if (p->node_spanned_pages) { -		unsigned long paddr = node_masks[nid].bootmem_paddr; -		unsigned long end_pfn; - -		end_pfn = p->node_start_pfn + p->node_spanned_pages; - -		numadbg("  init_bootmem_node(%d, %lx, %lx, %lx)\n", -			nid, paddr >> PAGE_SHIFT, p->node_start_pfn, end_pfn); - -		init_bootmem_node(p, paddr >> PAGE_SHIFT, -				  p->node_start_pfn, end_pfn); - -		numadbg("  free_bootmem_with_active_regions(%d, %lx)\n", -			nid, end_pfn); -		free_bootmem_with_active_regions(nid, end_pfn); - -		trim_reserved_in_node(nid); - -		numadbg("  sparse_memory_present_with_active_regions(%d)\n", -			nid); -		sparse_memory_present_with_active_regions(nid); -	} -} -  static unsigned long __init bootmem_init(unsigned long phys_base)  {  	unsigned long end_pfn; -	int nid;  	end_pfn = memblock_end_of_DRAM() >> PAGE_SHIFT;  	max_pfn = max_low_pfn = end_pfn; @@ -1369,11 +1285,12 @@ static unsigned long __init bootmem_init(unsigned long phys_base)  	if (bootmem_init_numa() < 0)  		bootmem_init_nonnuma(); -	/* XXX cpu notifier XXX */ +	/* Dump memblock with node info. */ +	memblock_dump_all(); -	for_each_online_node(nid) -		bootmem_init_one_node(nid); +	/* XXX cpu notifier XXX */ +	sparse_memory_present_with_active_regions(MAX_NUMNODES);  	sparse_init();  	return end_pfn; @@ -1701,6 +1618,7 @@ void __init paging_init(void)  {  	unsigned long end_pfn, shift, phys_base;  	unsigned long real_end, i; +	int node;  	/* These build time checkes make sure that the dcache_dirty_cpu()  	 * page->flags usage will work. @@ -1826,22 +1744,24 @@ void __init paging_init(void)  #endif  	} +	/* Setup bootmem... */ +	last_valid_pfn = end_pfn = bootmem_init(phys_base); +  	/* Once the OF device tree and MDESC have been setup, we know  	 * the list of possible cpus.  Therefore we can allocate the  	 * IRQ stacks.  	 */  	for_each_possible_cpu(i) { -		/* XXX Use node local allocations... XXX */ -		softirq_stack[i] = __va(memblock_alloc(THREAD_SIZE, THREAD_SIZE)); -		hardirq_stack[i] = __va(memblock_alloc(THREAD_SIZE, THREAD_SIZE)); -	} +		node = cpu_to_node(i); -	/* Setup bootmem... */ -	last_valid_pfn = end_pfn = bootmem_init(phys_base); +		softirq_stack[i] = __alloc_bootmem_node(NODE_DATA(node), +							THREAD_SIZE, +							THREAD_SIZE, 0); +		hardirq_stack[i] = __alloc_bootmem_node(NODE_DATA(node), +							THREAD_SIZE, +							THREAD_SIZE, 0); +	} -#ifndef CONFIG_NEED_MULTIPLE_NODES -	max_mapnr = last_valid_pfn; -#endif  	kernel_physical_mapping_init();  	{ @@ -1973,6 +1893,7 @@ void __init mem_init(void)  					free_all_bootmem_node(NODE_DATA(i));  			}  		} +		totalram_pages += free_low_memory_core_early(MAX_NUMNODES);  	}  #else  	totalram_pages = free_all_bootmem();  |