path: root/mm/vmalloc.c
diff options
authorClaudio Imbrenda <>2021-06-24 18:39:36 -0700
committerLinus Torvalds <>2021-06-24 19:40:53 -0700
commit15a64f5a8870b5610b616a4aa753262dfaa5d76e (patch)
treebc3b8e5b0d343720387a9ddbfd19095d1b265cdd /mm/vmalloc.c
parent8fd0c1b0647a6bda4067ee0cd61e8395954b6f28 (diff)
mm/vmalloc: add vmalloc_no_huge
Patch series "mm: add vmalloc_no_huge and use it", v4. Add vmalloc_no_huge() and export it, so modules can allocate memory with small pages. Use the newly added vmalloc_no_huge() in KVM on s390 to get around a hardware limitation. This patch (of 2): Commit 121e6f3258fe3 ("mm/vmalloc: hugepage vmalloc mappings") added support for hugepage vmalloc mappings, it also added the flag VM_NO_HUGE_VMAP for __vmalloc_node_range to request the allocation to be performed with 0-order non-huge pages. This flag is not accessible when calling vmalloc, the only option is to call directly __vmalloc_node_range, which is not exported. This means that a module can't vmalloc memory with small pages. Case in point: KVM on s390x needs to vmalloc a large area, and it needs to be mapped with non-huge pages, because of a hardware limitation. This patch adds the function vmalloc_no_huge, which works like vmalloc, but it is guaranteed to always back the mapping using small pages. This new function is exported, therefore it is usable by modules. [ whitespace fixes, per Christoph] Link: Link: Fixes: 121e6f3258fe3 ("mm/vmalloc: hugepage vmalloc mappings") Signed-off-by: Claudio Imbrenda <> Reviewed-by: Uladzislau Rezki (Sony) <> Acked-by: Nicholas Piggin <> Reviewed-by: David Hildenbrand <> Acked-by: David Rientjes <> Cc: Uladzislau Rezki (Sony) <> Cc: Catalin Marinas <> Cc: Thomas Gleixner <> Cc: Ingo Molnar <> Cc: Christoph Hellwig <> Cc: Cornelia Huck <> Signed-off-by: Andrew Morton <> Signed-off-by: Linus Torvalds <>
Diffstat (limited to 'mm/vmalloc.c')
1 files changed, 17 insertions, 0 deletions
diff --git a/mm/vmalloc.c b/mm/vmalloc.c
index a13ac524f6ff..fada19e17814 100644
--- a/mm/vmalloc.c
+++ b/mm/vmalloc.c
@@ -2999,6 +2999,23 @@ void *vmalloc(unsigned long size)
+ * vmalloc_no_huge - allocate virtually contiguous memory using small pages
+ * @size: allocation size
+ *
+ * Allocate enough non-huge pages to cover @size from the page level
+ * allocator and map them into contiguous kernel virtual space.
+ *
+ * Return: pointer to the allocated memory or %NULL on error
+ */
+void *vmalloc_no_huge(unsigned long size)
+ return __vmalloc_node_range(size, 1, VMALLOC_START, VMALLOC_END,
+ NUMA_NO_NODE, __builtin_return_address(0));
* vzalloc - allocate virtually contiguous memory with zero fill
* @size: allocation size