diff options
author | Mel Gorman <mel@csn.ul.ie> | 2006-10-11 04:20:39 -0400 |
---|---|---|
committer | Linus Torvalds <torvalds@g5.osdl.org> | 2006-10-11 14:14:14 -0400 |
commit | 6391af174ad75f72e92043c1dd8302660a2fec58 (patch) | |
tree | 43dfb9a1acfbdabb820180834d4e8efdcfcbe46e /arch/i386/kernel | |
parent | 4e0fadfcf62e252d2b14de0e0927eb2830c0c28c (diff) |
[PATCH] mm: use symbolic names instead of indices for zone initialisation
Arch-independent zone-sizing is using indices instead of symbolic names to
offset within an array related to zones (max_zone_pfns). The unintended
impact is that ZONE_DMA and ZONE_NORMAL is initialised on powerpc instead
of ZONE_DMA and ZONE_HIGHMEM when CONFIG_HIGHMEM is set. As a result, the
the machine fails to boot but will boot with CONFIG_HIGHMEM turned off.
The following patch properly initialises the max_zone_pfns[] array and uses
symbolic names instead of indices in each architecture using
arch-independent zone-sizing. Two users have successfully booted their
powerpcs with it (one an ibook G4). It has also been boot tested on x86,
x86_64, ppc64 and ia64. Please merge for 2.6.19-rc2.
Credit to Benjamin Herrenschmidt for identifying the bug and rolling the
first fix. Additional credit to Johannes Berg and Andreas Schwab for
reporting the problem and testing on powerpc.
Signed-off-by: Mel Gorman <mel@csn.ul.ie>
Cc: Benjamin Herrenschmidt <benh@kernel.crashing.org>
Signed-off-by: Andrew Morton <akpm@osdl.org>
Signed-off-by: Linus Torvalds <torvalds@osdl.org>
Diffstat (limited to 'arch/i386/kernel')
-rw-r--r-- | arch/i386/kernel/setup.c | 13 |
1 files changed, 6 insertions, 7 deletions
diff --git a/arch/i386/kernel/setup.c b/arch/i386/kernel/setup.c index 000cf03751fe..519e63c3c130 100644 --- a/arch/i386/kernel/setup.c +++ b/arch/i386/kernel/setup.c | |||
@@ -1083,16 +1083,15 @@ static unsigned long __init setup_memory(void) | |||
1083 | 1083 | ||
1084 | void __init zone_sizes_init(void) | 1084 | void __init zone_sizes_init(void) |
1085 | { | 1085 | { |
1086 | unsigned long max_zone_pfns[MAX_NR_ZONES]; | ||
1087 | memset(max_zone_pfns, 0, sizeof(max_zone_pfns)); | ||
1088 | max_zone_pfns[ZONE_DMA] = | ||
1089 | virt_to_phys((char *)MAX_DMA_ADDRESS) >> PAGE_SHIFT; | ||
1090 | max_zone_pfns[ZONE_NORMAL] = max_low_pfn; | ||
1086 | #ifdef CONFIG_HIGHMEM | 1091 | #ifdef CONFIG_HIGHMEM |
1087 | unsigned long max_zone_pfns[MAX_NR_ZONES] = { | 1092 | max_zone_pfns[ZONE_HIGHMEM] = highend_pfn; |
1088 | virt_to_phys((char *)MAX_DMA_ADDRESS) >> PAGE_SHIFT, | ||
1089 | max_low_pfn, | ||
1090 | highend_pfn}; | ||
1091 | add_active_range(0, 0, highend_pfn); | 1093 | add_active_range(0, 0, highend_pfn); |
1092 | #else | 1094 | #else |
1093 | unsigned long max_zone_pfns[MAX_NR_ZONES] = { | ||
1094 | virt_to_phys((char *)MAX_DMA_ADDRESS) >> PAGE_SHIFT, | ||
1095 | max_low_pfn}; | ||
1096 | add_active_range(0, 0, max_low_pfn); | 1095 | add_active_range(0, 0, max_low_pfn); |
1097 | #endif | 1096 | #endif |
1098 | 1097 | ||