aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorIvan Kokshaysky <ink@jurassic.park.msu.ru>2009-01-15 16:50:48 -0500
committerLinus Torvalds <torvalds@linux-foundation.org>2009-01-15 19:39:35 -0500
commit822c18f2e38cbc775792ab65ace4f9198678dec9 (patch)
tree3d14f9e7b479a786a87a481b8f429c753c5eb6fb
parentb46578ed094122a6b36002c644711cef68aa9c9e (diff)
alpha: fix vmalloc breakage
On alpha, we have to map some stuff in the VMALLOC space very early in the boot process (to make SRM console callbacks work and so on, see arch/alpha/mm/init.c). For old VM allocator, we just manually placed a vm_struct onto the global vmlist and this worked for ages. Unfortunately, the new allocator isn't aware of this, so it constantly tries to allocate the VM space which is already in use, making vmalloc on alpha defunct. This patch forces KVA to import vmlist entries on init. [akpm@linux-foundation.org: remove unneeded check (per Johannes)] Signed-off-by: Ivan Kokshaysky <ink@jurassic.park.msu.ru> Cc: Nick Piggin <npiggin@suse.de> Cc: Johannes Weiner <hannes@cmpxchg.org> Cc: Richard Henderson <rth@twiddle.net> Cc: Johannes Weiner <hannes@cmpxchg.org> Signed-off-by: Andrew Morton <akpm@linux-foundation.org> Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
-rw-r--r--mm/vmalloc.c11
1 files changed, 11 insertions, 0 deletions
diff --git a/mm/vmalloc.c b/mm/vmalloc.c
index c5db9a7264d9..7e00b280648a 100644
--- a/mm/vmalloc.c
+++ b/mm/vmalloc.c
@@ -24,6 +24,7 @@
24#include <linux/rbtree.h> 24#include <linux/rbtree.h>
25#include <linux/radix-tree.h> 25#include <linux/radix-tree.h>
26#include <linux/rcupdate.h> 26#include <linux/rcupdate.h>
27#include <linux/bootmem.h>
27 28
28#include <asm/atomic.h> 29#include <asm/atomic.h>
29#include <asm/uaccess.h> 30#include <asm/uaccess.h>
@@ -984,6 +985,8 @@ EXPORT_SYMBOL(vm_map_ram);
984 985
985void __init vmalloc_init(void) 986void __init vmalloc_init(void)
986{ 987{
988 struct vmap_area *va;
989 struct vm_struct *tmp;
987 int i; 990 int i;
988 991
989 for_each_possible_cpu(i) { 992 for_each_possible_cpu(i) {
@@ -996,6 +999,14 @@ void __init vmalloc_init(void)
996 vbq->nr_dirty = 0; 999 vbq->nr_dirty = 0;
997 } 1000 }
998 1001
1002 /* Import existing vmlist entries. */
1003 for (tmp = vmlist; tmp; tmp = tmp->next) {
1004 va = alloc_bootmem(sizeof(struct vmap_area));
1005 va->flags = tmp->flags | VM_VM_AREA;
1006 va->va_start = (unsigned long)tmp->addr;
1007 va->va_end = va->va_start + tmp->size;
1008 __insert_vmap_area(va);
1009 }
999 vmap_initialized = true; 1010 vmap_initialized = true;
1000} 1011}
1001 1012