diff options
Diffstat (limited to 'mm/bootmem.c')
| -rw-r--r-- | mm/bootmem.c | 24 | 
1 files changed, 24 insertions, 0 deletions
diff --git a/mm/bootmem.c b/mm/bootmem.c index 555d5d2731c..d1dc23cc7f1 100644 --- a/mm/bootmem.c +++ b/mm/bootmem.c @@ -143,6 +143,30 @@ unsigned long __init init_bootmem(unsigned long start, unsigned long pages)  	return init_bootmem_core(NODE_DATA(0)->bdata, start, 0, pages);  } +/* + * free_bootmem_late - free bootmem pages directly to page allocator + * @addr: starting address of the range + * @size: size of the range in bytes + * + * This is only useful when the bootmem allocator has already been torn + * down, but we are still initializing the system.  Pages are given directly + * to the page allocator, no bootmem metadata is updated because it is gone. + */ +void __init free_bootmem_late(unsigned long addr, unsigned long size) +{ +	unsigned long cursor, end; + +	kmemleak_free_part(__va(addr), size); + +	cursor = PFN_UP(addr); +	end = PFN_DOWN(addr + size); + +	for (; cursor < end; cursor++) { +		__free_pages_bootmem(pfn_to_page(cursor), 0); +		totalram_pages++; +	} +} +  static unsigned long __init free_all_bootmem_core(bootmem_data_t *bdata)  {  	int aligned;  |