Re: [PATCH v9 11/12] mm/vmalloc: Hugepage vmalloc mappings
From: Ding Tianhong <hidden>
Date: 2020-12-25 07:59:34
Also in:
linux-arch, linux-mm, lkml
quoted hunk ↗ jump to hunk
+again: + size = PAGE_ALIGN(size); + area = __get_vm_area_node(size, align, VM_ALLOC | VM_UNINITIALIZED | vm_flags, start, end, node, gfp_mask, caller); if (!area) goto fail; - addr = __vmalloc_area_node(area, gfp_mask, prot, node); + addr = __vmalloc_area_node(area, gfp_mask, prot, shift, node); if (!addr) - return NULL; + goto fail; /* * In this function, newly allocated vm_struct has VM_UNINITIALIZED@@ -2788,8 +2878,19 @@ void *__vmalloc_node_range(unsigned long size, unsigned long align, return addr; fail: - warn_alloc(gfp_mask, NULL, + if (shift > PAGE_SHIFT) { + free_vm_area(area); + shift = PAGE_SHIFT; + align = real_align; + size = real_size; + goto again; + } +
Hi, Nicholas: I met a problem like this: [ 67.103584] ------------[ cut here ]------------ [ 67.103884] kernel BUG at vmalloc.c:2892! [ 67.104387] Internal error: Oops - BUG: 0 [#1] SMP [ 67.104942] Process insmod (pid: 1161, stack limit = 0x(____ptrval____)) [ 67.105356] CPU: 2 PID: 1161 Comm: insmod Tainted: G O 4.19.95+ #9 [ 67.105702] Hardware name: linux,dummy-virt (DT) [ 67.106006] pstate: a0000005 (NzCv daif -PAN -UAO) [ 67.106285] pc : free_vm_area+0x78/0x80 [ 67.106549] lr : free_vm_area+0x58/0x80 it looks like when __vmalloc_area_node failed, the area is already released, and the free_vm_area will release the vm area again, so trigger the problem. 3405 ret = remove_vm_area(area->addr); 3406 BUG_ON(ret != area); 3407 kfree(area); Ding
+ if (!area) {
+ /* Warn for area allocation, page allocations already warn */
+ warn_alloc(gfp_mask, NULL,
"vmalloc: allocation failure: %lu bytes", real_size);
+ }
return NULL;
}