diff options
Diffstat (limited to 'arch/x86/mm/init_64.c')
| -rw-r--r-- | arch/x86/mm/init_64.c | 19 | 
1 files changed, 19 insertions, 0 deletions
diff --git a/arch/x86/mm/init_64.c b/arch/x86/mm/init_64.c index 5198b9bb34e..69ddfbd9113 100644 --- a/arch/x86/mm/init_64.c +++ b/arch/x86/mm/init_64.c @@ -49,6 +49,7 @@  #include <asm/numa.h>  #include <asm/cacheflush.h>  #include <asm/init.h> +#include <linux/bootmem.h>  static unsigned long dma_reserve __initdata; @@ -616,6 +617,21 @@ void __init paging_init(void)   */  #ifdef CONFIG_MEMORY_HOTPLUG  /* + * After memory hotplug the variables max_pfn, max_low_pfn and high_memory need + * updating. + */ +static void  update_end_of_memory_vars(u64 start, u64 size) +{ +	unsigned long end_pfn = PFN_UP(start + size); + +	if (end_pfn > max_pfn) { +		max_pfn = end_pfn; +		max_low_pfn = end_pfn; +		high_memory = (void *)__va(max_pfn * PAGE_SIZE - 1) + 1; +	} +} + +/*   * Memory is added always to NORMAL zone. This means you will never get   * additional DMA/DMA32 memory.   */ @@ -634,6 +650,9 @@ int arch_add_memory(int nid, u64 start, u64 size)  	ret = __add_pages(nid, zone, start_pfn, nr_pages);  	WARN_ON_ONCE(ret); +	/* update max_pfn, max_low_pfn and high_memory */ +	update_end_of_memory_vars(start, size); +  	return ret;  }  EXPORT_SYMBOL_GPL(arch_add_memory);  |