--- mm/vmalloc.c | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) Index: linux-2.6/mm/vmalloc.c =================================================================== --- linux-2.6.orig/mm/vmalloc.c 2008-04-29 20:53:42.197471603 -0700 +++ linux-2.6/mm/vmalloc.c 2008-04-29 21:10:58.382527446 -0700 @@ -1117,6 +1117,7 @@ static struct vm_struct *____alloc_vcomp struct page **pages2; struct page *head; + BUG_ON(!order); if (!pages) return NULL; @@ -1134,7 +1135,7 @@ static struct vm_struct *____alloc_vcomp pages[i] = page; } - vm = __get_vm_area_node(nr_pages << PAGE_SHIFT, VM_VCOMPOUND, + vm = __get_vm_area_node(PAGE_SIZE << order, VM_VCOMPOUND, VMALLOC_START, VMALLOC_END, node, gfp_mask, caller); if (!vm) @@ -1149,18 +1150,22 @@ static struct vm_struct *____alloc_vcomp /* Setup head page */ head = pages[0]; + BUG_ON(!head); __SetPageHead(head); __SetPageVcompound(head); set_page_address(head, vm->addr); + BUG_ON(!pages[1]); pages[1]->lru.prev = (void *)order; /* Setup tail pages */ for (i = 1; i < nr_pages; i++) { struct page *page = pages[i]; + printk("Setup page %d page=%p\n", i, page); + __SetPageTail(page); page->first_page = head; - set_page_address(page, vm->addr + (i << PAGE_SHIFT)); + set_page_address(page, vm->addr + i * PAGE_SIZE); } return vm;