The patch titled vmalloc : optimization, cleanup, bugfixes has been added to the -mm tree. Its filename is vmalloc-optimization-cleanup-bugfixes.patch See http://www.zip.com.au/~akpm/linux/patches/stuff/added-to-mm.txt to find out what to do about this ------------------------------------------------------ Subject: vmalloc : optimization, cleanup, bugfixes From: Eric Dumazet <dada1@xxxxxxxxxxxxx> - reorder 'struct vm_struct' to speedup lookups on CPUS with small cache lines. The fields 'next,addr,size' should be now in the same cache line, to speedup lookups. - One minor cleanup in __get_vm_area_node() - Bugfixes in vmalloc_user() and vmalloc_32_user() NULL returns from __vmalloc() and __find_vm_area() were not tested. Signed-off-by: Eric Dumazet <dada1@xxxxxxxxxxxxx> Cc: Nick Piggin <nickpiggin@xxxxxxxxxxxx> Signed-off-by: Andrew Morton <akpm@xxxxxxxx> --- include/linux/vmalloc.h | 3 ++- mm/vmalloc.c | 32 +++++++++++++++++--------------- 2 files changed, 19 insertions(+), 16 deletions(-) diff -puN include/linux/vmalloc.h~vmalloc-optimization-cleanup-bugfixes include/linux/vmalloc.h --- a/include/linux/vmalloc.h~vmalloc-optimization-cleanup-bugfixes +++ a/include/linux/vmalloc.h @@ -23,13 +23,14 @@ struct vm_area_struct; #endif struct vm_struct { + /* keep next,addr,size together to speedup lookups */ + struct vm_struct *next; void *addr; unsigned long size; unsigned long flags; struct page **pages; unsigned int nr_pages; unsigned long phys_addr; - struct vm_struct *next; }; /* diff -puN mm/vmalloc.c~vmalloc-optimization-cleanup-bugfixes mm/vmalloc.c --- a/mm/vmalloc.c~vmalloc-optimization-cleanup-bugfixes +++ a/mm/vmalloc.c @@ -180,15 +180,13 @@ struct vm_struct *__get_vm_area_node(uns addr = ALIGN(start, align); size = PAGE_ALIGN(size); + if (unlikely(!size)) + return NULL; + area = kmalloc_node(sizeof(*area), GFP_KERNEL, node); if (unlikely(!area)) return NULL; - if (unlikely(!size)) { - kfree (area); - return NULL; - } - /* * We always allocate a guard page. */ @@ -528,11 +526,13 @@ void *vmalloc_user(unsigned long size) void *ret; ret = __vmalloc(size, GFP_KERNEL | __GFP_HIGHMEM | __GFP_ZERO, PAGE_KERNEL); - write_lock(&vmlist_lock); - area = __find_vm_area(ret); - area->flags |= VM_USERMAP; - write_unlock(&vmlist_lock); - + if (ret) { + write_lock(&vmlist_lock); + area = __find_vm_area(ret); + BUG_ON(!area); + area->flags |= VM_USERMAP; + write_unlock(&vmlist_lock); + } return ret; } EXPORT_SYMBOL(vmalloc_user); @@ -601,11 +601,13 @@ void *vmalloc_32_user(unsigned long size void *ret; ret = __vmalloc(size, GFP_KERNEL | __GFP_ZERO, PAGE_KERNEL); - write_lock(&vmlist_lock); - area = __find_vm_area(ret); - area->flags |= VM_USERMAP; - write_unlock(&vmlist_lock); - + if (ret) { + write_lock(&vmlist_lock); + area = __find_vm_area(ret); + BUG_ON(!area); + area->flags |= VM_USERMAP; + write_unlock(&vmlist_lock); + } return ret; } EXPORT_SYMBOL(vmalloc_32_user); _ Patches currently in -mm which might be from dada1@xxxxxxxxxxxxx are origin.patch vmalloc-optimization-cleanup-bugfixes.patch vmalloc-optimization-cleanup-bugfixes-tweak.patch - To unsubscribe from this list: send the line "unsubscribe mm-commits" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html