summaryrefslogtreecommitdiffstats
path: root/arch/s390/mm/init.c
diff options
context:
space:
mode:
authorHeiko Carstens <heiko.carstens@de.ibm.com>2005-05-01 17:58:57 +0200
committerLinus Torvalds <torvalds@ppc970.osdl.org>2005-05-01 17:58:57 +0200
commitc9e3735359ac2d74ee61c6f1e5724f4a6db570bf (patch)
tree381204a24f4378d3c8d898f8e0210b1b97f5f248 /arch/s390/mm/init.c
parent[PATCH] s390: idle timer setup (diff)
downloadlinux-c9e3735359ac2d74ee61c6f1e5724f4a6db570bf.tar.xz
linux-c9e3735359ac2d74ee61c6f1e5724f4a6db570bf.zip
[PATCH] s390: fix memory holes and cleanup setup_arch
The memory setup didn't take care of memory holes and this makes the memory management think there would be more memory available than there is in reality. That causes the OOM killer to kill processes even if there is enough memory left that can be written to the swap space. The patch fixes this by using free_area_init_node with an array of memory holes instead of free_area_init. Further the patch cleans up the code in setup.c by splitting setup_arch into smaller pieces. Signed-off-by: Martin Schwidefsky <schwidefsky@de.ibm.com> Signed-off-by: Andrew Morton <akpm@osdl.org> Signed-off-by: Linus Torvalds <torvalds@osdl.org>
Diffstat (limited to 'arch/s390/mm/init.c')
-rw-r--r--arch/s390/mm/init.c15
1 files changed, 10 insertions, 5 deletions
diff --git a/arch/s390/mm/init.c b/arch/s390/mm/init.c
index 8e723bc7f795..6ec5cd981e74 100644
--- a/arch/s390/mm/init.c
+++ b/arch/s390/mm/init.c
@@ -101,6 +101,7 @@ extern unsigned long _end;
extern unsigned long __init_begin;
extern unsigned long __init_end;
+extern unsigned long __initdata zholes_size[];
/*
* paging_init() sets up the page tables
*/
@@ -163,10 +164,13 @@ void __init paging_init(void)
local_flush_tlb();
{
- unsigned long zones_size[MAX_NR_ZONES] = { 0, 0, 0};
+ unsigned long zones_size[MAX_NR_ZONES];
+ memset(zones_size, 0, sizeof(zones_size));
zones_size[ZONE_DMA] = max_low_pfn;
- free_area_init(zones_size);
+ free_area_init_node(0, &contig_page_data, zones_size,
+ __pa(PAGE_OFFSET) >> PAGE_SHIFT,
+ zholes_size);
}
return;
}
@@ -184,9 +188,10 @@ void __init paging_init(void)
_KERN_REGION_TABLE;
static const int ssm_mask = 0x04000000L;
- unsigned long zones_size[MAX_NR_ZONES] = {0, 0, 0};
+ unsigned long zones_size[MAX_NR_ZONES];
unsigned long dma_pfn, high_pfn;
+ memset(zones_size, 0, sizeof(zones_size));
dma_pfn = MAX_DMA_ADDRESS >> PAGE_SHIFT;
high_pfn = max_low_pfn;
@@ -198,8 +203,8 @@ void __init paging_init(void)
}
/* Initialize mem_map[]. */
- free_area_init(zones_size);
-
+ free_area_init_node(0, &contig_page_data, zones_size,
+ __pa(PAGE_OFFSET) >> PAGE_SHIFT, zholes_size);
/*
* map whole physical memory to virtual memory (identity mapping)