diff options
Diffstat (limited to 'mm/bootmem.c')
| -rw-r--r-- | mm/bootmem.c | 180 | 
1 files changed, 10 insertions, 170 deletions
diff --git a/mm/bootmem.c b/mm/bootmem.c index 13b0caa9793c..07aeb89e396e 100644 --- a/mm/bootmem.c +++ b/mm/bootmem.c @@ -23,6 +23,13 @@  #include "internal.h" +#ifndef CONFIG_NEED_MULTIPLE_NODES +struct pglist_data __refdata contig_page_data = { +	.bdata = &bootmem_node_data[0] +}; +EXPORT_SYMBOL(contig_page_data); +#endif +  unsigned long max_low_pfn;  unsigned long min_low_pfn;  unsigned long max_pfn; @@ -35,7 +42,6 @@ unsigned long max_pfn;  unsigned long saved_max_pfn;  #endif -#ifndef CONFIG_NO_BOOTMEM  bootmem_data_t bootmem_node_data[MAX_NUMNODES] __initdata;  static struct list_head bdata_list __initdata = LIST_HEAD_INIT(bdata_list); @@ -146,7 +152,7 @@ unsigned long __init init_bootmem(unsigned long start, unsigned long pages)  	min_low_pfn = start;  	return init_bootmem_core(NODE_DATA(0)->bdata, start, 0, pages);  } -#endif +  /*   * free_bootmem_late - free bootmem pages directly to page allocator   * @addr: starting address of the range @@ -171,53 +177,6 @@ void __init free_bootmem_late(unsigned long addr, unsigned long size)  	}  } -#ifdef CONFIG_NO_BOOTMEM -static void __init __free_pages_memory(unsigned long start, unsigned long end) -{ -	int i; -	unsigned long start_aligned, end_aligned; -	int order = ilog2(BITS_PER_LONG); - -	start_aligned = (start + (BITS_PER_LONG - 1)) & ~(BITS_PER_LONG - 1); -	end_aligned = end & ~(BITS_PER_LONG - 1); - -	if (end_aligned <= start_aligned) { -		for (i = start; i < end; i++) -			__free_pages_bootmem(pfn_to_page(i), 0); - -		return; -	} - -	for (i = start; i < start_aligned; i++) -		__free_pages_bootmem(pfn_to_page(i), 0); - -	for (i = start_aligned; i < end_aligned; i += BITS_PER_LONG) -		__free_pages_bootmem(pfn_to_page(i), order); - -	for (i = end_aligned; i < end; i++) -		__free_pages_bootmem(pfn_to_page(i), 0); -} - -unsigned long __init free_all_memory_core_early(int nodeid) -{ -	int i; -	u64 start, end; -	unsigned long count = 0; -	struct range *range = NULL; -	int nr_range; - -	nr_range = get_free_all_memory_range(&range, nodeid); - -	for (i = 0; i < nr_range; i++) { -		start = range[i].start; -		end = range[i].end; -		count += end - start; -		__free_pages_memory(start, end); -	} - -	return count; -} -#else  static unsigned long __init free_all_bootmem_core(bootmem_data_t *bdata)  {  	int aligned; @@ -278,7 +237,6 @@ static unsigned long __init free_all_bootmem_core(bootmem_data_t *bdata)  	return count;  } -#endif  /**   * free_all_bootmem_node - release a node's free pages to the buddy allocator @@ -289,12 +247,7 @@ static unsigned long __init free_all_bootmem_core(bootmem_data_t *bdata)  unsigned long __init free_all_bootmem_node(pg_data_t *pgdat)  {  	register_page_bootmem_info_node(pgdat); -#ifdef CONFIG_NO_BOOTMEM -	/* free_all_memory_core_early(MAX_NUMNODES) will be called later */ -	return 0; -#else  	return free_all_bootmem_core(pgdat->bdata); -#endif  }  /** @@ -304,16 +257,6 @@ unsigned long __init free_all_bootmem_node(pg_data_t *pgdat)   */  unsigned long __init free_all_bootmem(void)  { -#ifdef CONFIG_NO_BOOTMEM -	/* -	 * We need to use MAX_NUMNODES instead of NODE_DATA(0)->node_id -	 *  because in some case like Node0 doesnt have RAM installed -	 *  low ram will be on Node1 -	 * Use MAX_NUMNODES will make sure all ranges in early_node_map[] -	 *  will be used instead of only Node0 related -	 */ -	return free_all_memory_core_early(MAX_NUMNODES); -#else  	unsigned long total_pages = 0;  	bootmem_data_t *bdata; @@ -321,10 +264,8 @@ unsigned long __init free_all_bootmem(void)  		total_pages += free_all_bootmem_core(bdata);  	return total_pages; -#endif  } -#ifndef CONFIG_NO_BOOTMEM  static void __init __free(bootmem_data_t *bdata,  			unsigned long sidx, unsigned long eidx)  { @@ -419,7 +360,6 @@ static int __init mark_bootmem(unsigned long start, unsigned long end,  	}  	BUG();  } -#endif  /**   * free_bootmem_node - mark a page range as usable @@ -434,10 +374,6 @@ static int __init mark_bootmem(unsigned long start, unsigned long end,  void __init free_bootmem_node(pg_data_t *pgdat, unsigned long physaddr,  			      unsigned long size)  { -#ifdef CONFIG_NO_BOOTMEM -	kmemleak_free_part(__va(physaddr), size); -	memblock_x86_free_range(physaddr, physaddr + size); -#else  	unsigned long start, end;  	kmemleak_free_part(__va(physaddr), size); @@ -446,7 +382,6 @@ void __init free_bootmem_node(pg_data_t *pgdat, unsigned long physaddr,  	end = PFN_DOWN(physaddr + size);  	mark_bootmem_node(pgdat->bdata, start, end, 0, 0); -#endif  }  /** @@ -460,10 +395,6 @@ void __init free_bootmem_node(pg_data_t *pgdat, unsigned long physaddr,   */  void __init free_bootmem(unsigned long addr, unsigned long size)  { -#ifdef CONFIG_NO_BOOTMEM -	kmemleak_free_part(__va(addr), size); -	memblock_x86_free_range(addr, addr + size); -#else  	unsigned long start, end;  	kmemleak_free_part(__va(addr), size); @@ -472,7 +403,6 @@ void __init free_bootmem(unsigned long addr, unsigned long size)  	end = PFN_DOWN(addr + size);  	mark_bootmem(start, end, 0, 0); -#endif  }  /** @@ -489,17 +419,12 @@ void __init free_bootmem(unsigned long addr, unsigned long size)  int __init reserve_bootmem_node(pg_data_t *pgdat, unsigned long physaddr,  				 unsigned long size, int flags)  { -#ifdef CONFIG_NO_BOOTMEM -	panic("no bootmem"); -	return 0; -#else  	unsigned long start, end;  	start = PFN_DOWN(physaddr);  	end = PFN_UP(physaddr + size);  	return mark_bootmem_node(pgdat->bdata, start, end, 1, flags); -#endif  }  /** @@ -515,20 +440,14 @@ int __init reserve_bootmem_node(pg_data_t *pgdat, unsigned long physaddr,  int __init reserve_bootmem(unsigned long addr, unsigned long size,  			    int flags)  { -#ifdef CONFIG_NO_BOOTMEM -	panic("no bootmem"); -	return 0; -#else  	unsigned long start, end;  	start = PFN_DOWN(addr);  	end = PFN_UP(addr + size);  	return mark_bootmem(start, end, 1, flags); -#endif  } -#ifndef CONFIG_NO_BOOTMEM  int __weak __init reserve_bootmem_generic(unsigned long phys, unsigned long len,  				   int flags)  { @@ -685,33 +604,12 @@ static void * __init alloc_arch_preferred_bootmem(bootmem_data_t *bdata,  #endif  	return NULL;  } -#endif  static void * __init ___alloc_bootmem_nopanic(unsigned long size,  					unsigned long align,  					unsigned long goal,  					unsigned long limit)  { -#ifdef CONFIG_NO_BOOTMEM -	void *ptr; - -	if (WARN_ON_ONCE(slab_is_available())) -		return kzalloc(size, GFP_NOWAIT); - -restart: - -	ptr = __alloc_memory_core_early(MAX_NUMNODES, size, align, goal, limit); - -	if (ptr) -		return ptr; - -	if (goal != 0) { -		goal = 0; -		goto restart; -	} - -	return NULL; -#else  	bootmem_data_t *bdata;  	void *region; @@ -737,7 +635,6 @@ restart:  	}  	return NULL; -#endif  }  /** @@ -758,10 +655,6 @@ void * __init __alloc_bootmem_nopanic(unsigned long size, unsigned long align,  {  	unsigned long limit = 0; -#ifdef CONFIG_NO_BOOTMEM -	limit = -1UL; -#endif -  	return ___alloc_bootmem_nopanic(size, align, goal, limit);  } @@ -798,14 +691,9 @@ void * __init __alloc_bootmem(unsigned long size, unsigned long align,  {  	unsigned long limit = 0; -#ifdef CONFIG_NO_BOOTMEM -	limit = -1UL; -#endif -  	return ___alloc_bootmem(size, align, goal, limit);  } -#ifndef CONFIG_NO_BOOTMEM  static void * __init ___alloc_bootmem_node(bootmem_data_t *bdata,  				unsigned long size, unsigned long align,  				unsigned long goal, unsigned long limit) @@ -822,7 +710,6 @@ static void * __init ___alloc_bootmem_node(bootmem_data_t *bdata,  	return ___alloc_bootmem(size, align, goal, limit);  } -#endif  /**   * __alloc_bootmem_node - allocate boot memory from a specific node @@ -842,24 +729,10 @@ static void * __init ___alloc_bootmem_node(bootmem_data_t *bdata,  void * __init __alloc_bootmem_node(pg_data_t *pgdat, unsigned long size,  				   unsigned long align, unsigned long goal)  { -	void *ptr; -  	if (WARN_ON_ONCE(slab_is_available()))  		return kzalloc_node(size, GFP_NOWAIT, pgdat->node_id); -#ifdef CONFIG_NO_BOOTMEM -	ptr = __alloc_memory_core_early(pgdat->node_id, size, align, -					 goal, -1ULL); -	if (ptr) -		return ptr; - -	ptr = __alloc_memory_core_early(MAX_NUMNODES, size, align, -					 goal, -1ULL); -#else -	ptr = ___alloc_bootmem_node(pgdat->bdata, size, align, goal, 0); -#endif - -	return ptr; +	return  ___alloc_bootmem_node(pgdat->bdata, size, align, goal, 0);  }  void * __init __alloc_bootmem_node_high(pg_data_t *pgdat, unsigned long size, @@ -880,13 +753,8 @@ void * __init __alloc_bootmem_node_high(pg_data_t *pgdat, unsigned long size,  		unsigned long new_goal;  		new_goal = MAX_DMA32_PFN << PAGE_SHIFT; -#ifdef CONFIG_NO_BOOTMEM -		ptr =  __alloc_memory_core_early(pgdat->node_id, size, align, -						 new_goal, -1ULL); -#else  		ptr = alloc_bootmem_core(pgdat->bdata, size, align,  						 new_goal, 0); -#endif  		if (ptr)  			return ptr;  	} @@ -907,16 +775,6 @@ void * __init __alloc_bootmem_node_high(pg_data_t *pgdat, unsigned long size,  void * __init alloc_bootmem_section(unsigned long size,  				    unsigned long section_nr)  { -#ifdef CONFIG_NO_BOOTMEM -	unsigned long pfn, goal, limit; - -	pfn = section_nr_to_pfn(section_nr); -	goal = pfn << PAGE_SHIFT; -	limit = section_nr_to_pfn(section_nr + 1) << PAGE_SHIFT; - -	return __alloc_memory_core_early(early_pfn_to_nid(pfn), size, -					 SMP_CACHE_BYTES, goal, limit); -#else  	bootmem_data_t *bdata;  	unsigned long pfn, goal, limit; @@ -926,7 +784,6 @@ void * __init alloc_bootmem_section(unsigned long size,  	bdata = &bootmem_node_data[early_pfn_to_nid(pfn)];  	return alloc_bootmem_core(bdata, size, SMP_CACHE_BYTES, goal, limit); -#endif  }  #endif @@ -938,16 +795,11 @@ void * __init __alloc_bootmem_node_nopanic(pg_data_t *pgdat, unsigned long size,  	if (WARN_ON_ONCE(slab_is_available()))  		return kzalloc_node(size, GFP_NOWAIT, pgdat->node_id); -#ifdef CONFIG_NO_BOOTMEM -	ptr =  __alloc_memory_core_early(pgdat->node_id, size, align, -						 goal, -1ULL); -#else  	ptr = alloc_arch_preferred_bootmem(pgdat->bdata, size, align, goal, 0);  	if (ptr)  		return ptr;  	ptr = alloc_bootmem_core(pgdat->bdata, size, align, goal, 0); -#endif  	if (ptr)  		return ptr; @@ -995,21 +847,9 @@ void * __init __alloc_bootmem_low(unsigned long size, unsigned long align,  void * __init __alloc_bootmem_low_node(pg_data_t *pgdat, unsigned long size,  				       unsigned long align, unsigned long goal)  { -	void *ptr; -  	if (WARN_ON_ONCE(slab_is_available()))  		return kzalloc_node(size, GFP_NOWAIT, pgdat->node_id); -#ifdef CONFIG_NO_BOOTMEM -	ptr = __alloc_memory_core_early(pgdat->node_id, size, align, +	return ___alloc_bootmem_node(pgdat->bdata, size, align,  				goal, ARCH_LOW_ADDRESS_LIMIT); -	if (ptr) -		return ptr; -	ptr = __alloc_memory_core_early(MAX_NUMNODES, size, align, -				goal, ARCH_LOW_ADDRESS_LIMIT); -#else -	ptr = ___alloc_bootmem_node(pgdat->bdata, size, align, -				goal, ARCH_LOW_ADDRESS_LIMIT); -#endif -	return ptr;  }  | 
