From mboxrd@z Thu Jan 1 00:00:00 1970 From: Jeremy Fitzhardinge Subject: [patch 16/26] Xen-paravirt_ops: Allocate and free vmalloc areas Date: Tue, 27 Feb 2007 00:13:53 -0800 Message-ID: <20070227081635.287578759@goop.org> References: <20070227081337.434798469@goop.org> Return-path: Content-Disposition: inline; filename=alloc-vm-area.patch List-Unsubscribe: , List-Post: List-Help: List-Subscribe: , Sender: xen-devel-bounces@lists.xensource.com Errors-To: xen-devel-bounces@lists.xensource.com To: Andi Kleen Cc: Zachary Amsden , xen-devel@lists.xensource.com, Ian Pratt , Rusty Russell , linux-kernel@vger.kernel.org, Jan Beulich , Chris Wright , virtualization@lists.osdl.org, Andrew Morton , Christian Limpach List-Id: virtualization@lists.linuxfoundation.org Allocate/destroy a 'vmalloc' VM area: alloc_vm_area and free_vm_area The alloc function ensures that page tables are constructed for the region of kernel virtual address space and mapped into init_mm. Signed-off-by: Jeremy Fitzhardinge Signed-off-by: Ian Pratt Signed-off-by: Christian Limpach Signed-off-by: Chris Wright Cc: "Jan Beulich" Cc: "Andi Kleen" --- arch/i386/mm/fault.c | 43 +++++++++++++++++++++++++++++++++++++++++++ include/linux/vmalloc.h | 4 ++++ 2 files changed, 47 insertions(+) =================================================================== --- a/arch/i386/mm/fault.c +++ b/arch/i386/mm/fault.c @@ -23,6 +23,7 @@ #include #include #include +#include #include #include @@ -624,3 +625,45 @@ void _vmalloc_sync_all(void) start = address + PGDIR_SIZE; } } + + +static int f(pte_t *pte, struct page *pmd_page, unsigned long addr, void *data) +{ + /* apply_to_page_range() does all the hard work. */ + return 0; +} + +struct vm_struct *alloc_vm_area(unsigned long size) +{ + struct vm_struct *area; + + area = get_vm_area(size, VM_IOREMAP); + if (area == NULL) + return NULL; + + /* + * This ensures that page tables are constructed for this region + * of kernel virtual address space and mapped into init_mm. + */ + if (apply_to_page_range(&init_mm, (unsigned long)area->addr, + area->size, f, NULL)) { + free_vm_area(area); + return NULL; + } + + /* Make sure the pagetables are constructed in process kernel + mappings */ + vmalloc_sync_all(); + + return area; +} +EXPORT_SYMBOL_GPL(alloc_vm_area); + +void free_vm_area(struct vm_struct *area) +{ + struct vm_struct *ret; + ret = remove_vm_area(area->addr); + BUG_ON(ret != area); + kfree(area); +} +EXPORT_SYMBOL_GPL(free_vm_area); =================================================================== --- a/include/linux/vmalloc.h +++ b/include/linux/vmalloc.h @@ -68,6 +68,10 @@ extern int map_vm_area(struct vm_struct struct page ***pages); extern void unmap_vm_area(struct vm_struct *area); +/* Allocate/destroy a 'vmalloc' VM area. */ +extern struct vm_struct *alloc_vm_area(unsigned long size); +extern void free_vm_area(struct vm_struct *area); + /* * Internals. Dont't use.. */ --