summaryrefslogtreecommitdiffstats
path: root/arch/x86/include/asm
diff options
context:
space:
mode:
authorRafael J. Wysocki <rjw@sisk.pl>2008-11-12 23:22:35 +0100
committerIngo Molnar <mingo@elte.hu>2008-11-12 23:28:51 +0100
commit97a70e548bd97d5a46ae9d44f24aafcc013fd701 (patch)
treed6374f548e88c41d212cef1494cf347f514e4cf3 /arch/x86/include/asm
parent3edac25f2e8ac8c2a84904c140e1aeb434e73e75 (diff)
downloadlinux-stable-97a70e548bd97d5a46ae9d44f24aafcc013fd701.tar.gz
linux-stable-97a70e548bd97d5a46ae9d44f24aafcc013fd701.tar.bz2
linux-stable-97a70e548bd97d5a46ae9d44f24aafcc013fd701.zip
x86, hibernate: fix breakage on x86_32 with CONFIG_NUMA set
Impact: fix crash during hibernation on 32-bit NUMA The NUMA code on x86_32 creates special memory mapping that allows each node's pgdat to be located in this node's memory. For this purpose it allocates a memory area at the end of each node's memory and maps this area so that it is accessible with virtual addresses belonging to low memory. As a result, if there is high memory, these NUMA-allocated areas are physically located in high memory, although they are mapped to low memory addresses. Our hibernation code does not take that into account and for this reason hibernation fails on all x86_32 systems with CONFIG_NUMA=y and with high memory present. Fix this by adding a special mapping for the NUMA-allocated memory areas to the temporary page tables created during the last phase of resume. Signed-off-by: Rafael J. Wysocki <rjw@sisk.pl> Signed-off-by: Ingo Molnar <mingo@elte.hu>
Diffstat (limited to 'arch/x86/include/asm')
-rw-r--r--arch/x86/include/asm/mmzone_32.h4
1 files changed, 4 insertions, 0 deletions
diff --git a/arch/x86/include/asm/mmzone_32.h b/arch/x86/include/asm/mmzone_32.h
index 485bdf059ffb..07f1af494ca5 100644
--- a/arch/x86/include/asm/mmzone_32.h
+++ b/arch/x86/include/asm/mmzone_32.h
@@ -34,10 +34,14 @@ static inline void get_memcfg_numa(void)
extern int early_pfn_to_nid(unsigned long pfn);
+extern void resume_map_numa_kva(pgd_t *pgd);
+
#else /* !CONFIG_NUMA */
#define get_memcfg_numa get_memcfg_numa_flat
+static inline void resume_map_numa_kva(pgd_t *pgd) {}
+
#endif /* CONFIG_NUMA */
#ifdef CONFIG_DISCONTIGMEM