diff options
-rw-r--r-- | arch/alpha/mm/init.c | 20 | ||||
-rw-r--r-- | include/linux/vmalloc.h | 1 | ||||
-rw-r--r-- | mm/vmalloc.c | 24 |
3 files changed, 38 insertions, 7 deletions
diff --git a/arch/alpha/mm/init.c b/arch/alpha/mm/init.c index 5d7a16eab312..df6df025ded4 100644 --- a/arch/alpha/mm/init.c +++ b/arch/alpha/mm/init.c | |||
@@ -189,9 +189,21 @@ callback_init(void * kernel_end) | |||
189 | 189 | ||
190 | if (alpha_using_srm) { | 190 | if (alpha_using_srm) { |
191 | static struct vm_struct console_remap_vm; | 191 | static struct vm_struct console_remap_vm; |
192 | unsigned long vaddr = VMALLOC_START; | 192 | unsigned long nr_pages = 0; |
193 | unsigned long vaddr; | ||
193 | unsigned long i, j; | 194 | unsigned long i, j; |
194 | 195 | ||
196 | /* calculate needed size */ | ||
197 | for (i = 0; i < crb->map_entries; ++i) | ||
198 | nr_pages += crb->map[i].count; | ||
199 | |||
200 | /* register the vm area */ | ||
201 | console_remap_vm.flags = VM_ALLOC; | ||
202 | console_remap_vm.size = nr_pages << PAGE_SHIFT; | ||
203 | vm_area_register_early(&console_remap_vm); | ||
204 | |||
205 | vaddr = (unsigned long)consle_remap_vm.addr; | ||
206 | |||
195 | /* Set up the third level PTEs and update the virtual | 207 | /* Set up the third level PTEs and update the virtual |
196 | addresses of the CRB entries. */ | 208 | addresses of the CRB entries. */ |
197 | for (i = 0; i < crb->map_entries; ++i) { | 209 | for (i = 0; i < crb->map_entries; ++i) { |
@@ -213,12 +225,6 @@ callback_init(void * kernel_end) | |||
213 | vaddr += PAGE_SIZE; | 225 | vaddr += PAGE_SIZE; |
214 | } | 226 | } |
215 | } | 227 | } |
216 | |||
217 | /* Let vmalloc know that we've allocated some space. */ | ||
218 | console_remap_vm.flags = VM_ALLOC; | ||
219 | console_remap_vm.addr = (void *) VMALLOC_START; | ||
220 | console_remap_vm.size = vaddr - VMALLOC_START; | ||
221 | vmlist = &console_remap_vm; | ||
222 | } | 228 | } |
223 | 229 | ||
224 | callback_init_done = 1; | 230 | callback_init_done = 1; |
diff --git a/include/linux/vmalloc.h b/include/linux/vmalloc.h index 506e7620a986..bbc051392298 100644 --- a/include/linux/vmalloc.h +++ b/include/linux/vmalloc.h | |||
@@ -106,5 +106,6 @@ extern long vwrite(char *buf, char *addr, unsigned long count); | |||
106 | */ | 106 | */ |
107 | extern rwlock_t vmlist_lock; | 107 | extern rwlock_t vmlist_lock; |
108 | extern struct vm_struct *vmlist; | 108 | extern struct vm_struct *vmlist; |
109 | extern __init void vm_area_register_early(struct vm_struct *vm); | ||
109 | 110 | ||
110 | #endif /* _LINUX_VMALLOC_H */ | 111 | #endif /* _LINUX_VMALLOC_H */ |
diff --git a/mm/vmalloc.c b/mm/vmalloc.c index c37924a2ee36..d206261ad9ef 100644 --- a/mm/vmalloc.c +++ b/mm/vmalloc.c | |||
@@ -24,6 +24,7 @@ | |||
24 | #include <linux/radix-tree.h> | 24 | #include <linux/radix-tree.h> |
25 | #include <linux/rcupdate.h> | 25 | #include <linux/rcupdate.h> |
26 | #include <linux/bootmem.h> | 26 | #include <linux/bootmem.h> |
27 | #include <linux/pfn.h> | ||
27 | 28 | ||
28 | #include <asm/atomic.h> | 29 | #include <asm/atomic.h> |
29 | #include <asm/uaccess.h> | 30 | #include <asm/uaccess.h> |
@@ -982,6 +983,29 @@ void *vm_map_ram(struct page **pages, unsigned int count, int node, pgprot_t pro | |||
982 | } | 983 | } |
983 | EXPORT_SYMBOL(vm_map_ram); | 984 | EXPORT_SYMBOL(vm_map_ram); |
984 | 985 | ||
986 | /** | ||
987 | * vm_area_register_early - register vmap area early during boot | ||
988 | * @vm: vm_struct to register | ||
989 | * @size: size of area to register | ||
990 | * | ||
991 | * This function is used to register kernel vm area before | ||
992 | * vmalloc_init() is called. @vm->size and @vm->flags should contain | ||
993 | * proper values on entry and other fields should be zero. On return, | ||
994 | * vm->addr contains the allocated address. | ||
995 | * | ||
996 | * DO NOT USE THIS FUNCTION UNLESS YOU KNOW WHAT YOU'RE DOING. | ||
997 | */ | ||
998 | void __init vm_area_register_early(struct vm_struct *vm) | ||
999 | { | ||
1000 | static size_t vm_init_off __initdata; | ||
1001 | |||
1002 | vm->addr = (void *)VMALLOC_START + vm_init_off; | ||
1003 | vm_init_off = PFN_ALIGN(vm_init_off + vm->size); | ||
1004 | |||
1005 | vm->next = vmlist; | ||
1006 | vmlist = vm; | ||
1007 | } | ||
1008 | |||
985 | void __init vmalloc_init(void) | 1009 | void __init vmalloc_init(void) |
986 | { | 1010 | { |
987 | struct vmap_area *va; | 1011 | struct vmap_area *va; |