diff options
| author | Shaohui Zheng <shaohui.zheng@intel.com> | 2010-02-02 16:44:16 -0500 |
|---|---|---|
| committer | Linus Torvalds <torvalds@linux-foundation.org> | 2010-02-02 21:11:23 -0500 |
| commit | ea0854170c95245a258b386c7a9314399c949fe0 (patch) | |
| tree | 59a7ec7cbe8200fd79dc4a7188958c2d5cbef5b7 | |
| parent | a225a5cc2c25e1217e68ee2ab8dd4454573fa308 (diff) | |
memory hotplug: fix a bug on /dev/mem for 64-bit kernels
Newly added memory can not be accessed via /dev/mem, because we do not
update the variables high_memory, max_pfn and max_low_pfn.
Add a function update_end_of_memory_vars() to update these variables for
64-bit kernels.
[akpm@linux-foundation.org: simplify comment]
Signed-off-by: Shaohui Zheng <shaohui.zheng@intel.com>
Cc: Andi Kleen <ak@linux.intel.com>
Cc: Li Haicheng <haicheng.li@intel.com>
Reviewed-by: Wu Fengguang <fengguang.wu@intel.com>
Reviewed-by: KAMEZAWA Hiroyuki <kamezawa.hiroyu@jp.fujitsu.com>
Cc: Ingo Molnar <mingo@elte.hu>
Cc: Thomas Gleixner <tglx@linutronix.de>
Cc: "H. Peter Anvin" <hpa@zytor.com>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
| -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 5198b9bb34ef..69ddfbd91135 100644 --- a/arch/x86/mm/init_64.c +++ b/arch/x86/mm/init_64.c | |||
| @@ -49,6 +49,7 @@ | |||
| 49 | #include <asm/numa.h> | 49 | #include <asm/numa.h> |
| 50 | #include <asm/cacheflush.h> | 50 | #include <asm/cacheflush.h> |
| 51 | #include <asm/init.h> | 51 | #include <asm/init.h> |
| 52 | #include <linux/bootmem.h> | ||
| 52 | 53 | ||
| 53 | static unsigned long dma_reserve __initdata; | 54 | static unsigned long dma_reserve __initdata; |
| 54 | 55 | ||
| @@ -616,6 +617,21 @@ void __init paging_init(void) | |||
| 616 | */ | 617 | */ |
| 617 | #ifdef CONFIG_MEMORY_HOTPLUG | 618 | #ifdef CONFIG_MEMORY_HOTPLUG |
| 618 | /* | 619 | /* |
| 620 | * After memory hotplug the variables max_pfn, max_low_pfn and high_memory need | ||
| 621 | * updating. | ||
| 622 | */ | ||
| 623 | static void update_end_of_memory_vars(u64 start, u64 size) | ||
| 624 | { | ||
| 625 | unsigned long end_pfn = PFN_UP(start + size); | ||
| 626 | |||
| 627 | if (end_pfn > max_pfn) { | ||
| 628 | max_pfn = end_pfn; | ||
| 629 | max_low_pfn = end_pfn; | ||
| 630 | high_memory = (void *)__va(max_pfn * PAGE_SIZE - 1) + 1; | ||
| 631 | } | ||
| 632 | } | ||
| 633 | |||
| 634 | /* | ||
| 619 | * Memory is added always to NORMAL zone. This means you will never get | 635 | * Memory is added always to NORMAL zone. This means you will never get |
| 620 | * additional DMA/DMA32 memory. | 636 | * additional DMA/DMA32 memory. |
| 621 | */ | 637 | */ |
| @@ -634,6 +650,9 @@ int arch_add_memory(int nid, u64 start, u64 size) | |||
| 634 | ret = __add_pages(nid, zone, start_pfn, nr_pages); | 650 | ret = __add_pages(nid, zone, start_pfn, nr_pages); |
| 635 | WARN_ON_ONCE(ret); | 651 | WARN_ON_ONCE(ret); |
| 636 | 652 | ||
| 653 | /* update max_pfn, max_low_pfn and high_memory */ | ||
| 654 | update_end_of_memory_vars(start, size); | ||
| 655 | |||
| 637 | return ret; | 656 | return ret; |
| 638 | } | 657 | } |
| 639 | EXPORT_SYMBOL_GPL(arch_add_memory); | 658 | EXPORT_SYMBOL_GPL(arch_add_memory); |
