Skip to content

Commit 15a64f5

Browse files
Claudio Imbrendatorvalds
authored andcommitted
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 121e6f3 ("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. [[email protected]: whitespace fixes, per Christoph] Link: https://lkml.kernel.org/r/[email protected] Link: https://lkml.kernel.org/r/[email protected] Fixes: 121e6f3 ("mm/vmalloc: hugepage vmalloc mappings") Signed-off-by: Claudio Imbrenda <[email protected]> Reviewed-by: Uladzislau Rezki (Sony) <[email protected]> Acked-by: Nicholas Piggin <[email protected]> Reviewed-by: David Hildenbrand <[email protected]> Acked-by: David Rientjes <[email protected]> Cc: Uladzislau Rezki (Sony) <[email protected]> Cc: Catalin Marinas <[email protected]> Cc: Thomas Gleixner <[email protected]> Cc: Ingo Molnar <[email protected]> Cc: Christoph Hellwig <[email protected]> Cc: Cornelia Huck <[email protected]> Signed-off-by: Andrew Morton <[email protected]> Signed-off-by: Linus Torvalds <[email protected]>
1 parent 8fd0c1b commit 15a64f5

File tree

2 files changed

+18
-0
lines changed

2 files changed

+18
-0
lines changed

include/linux/vmalloc.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -135,6 +135,7 @@ extern void *__vmalloc_node_range(unsigned long size, unsigned long align,
135135
const void *caller);
136136
void *__vmalloc_node(unsigned long size, unsigned long align, gfp_t gfp_mask,
137137
int node, const void *caller);
138+
void *vmalloc_no_huge(unsigned long size);
138139

139140
extern void vfree(const void *addr);
140141
extern void vfree_atomic(const void *addr);

mm/vmalloc.c

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2998,6 +2998,23 @@ void *vmalloc(unsigned long size)
29982998
}
29992999
EXPORT_SYMBOL(vmalloc);
30003000

3001+
/**
3002+
* vmalloc_no_huge - allocate virtually contiguous memory using small pages
3003+
* @size: allocation size
3004+
*
3005+
* Allocate enough non-huge pages to cover @size from the page level
3006+
* allocator and map them into contiguous kernel virtual space.
3007+
*
3008+
* Return: pointer to the allocated memory or %NULL on error
3009+
*/
3010+
void *vmalloc_no_huge(unsigned long size)
3011+
{
3012+
return __vmalloc_node_range(size, 1, VMALLOC_START, VMALLOC_END,
3013+
GFP_KERNEL, PAGE_KERNEL, VM_NO_HUGE_VMAP,
3014+
NUMA_NO_NODE, __builtin_return_address(0));
3015+
}
3016+
EXPORT_SYMBOL(vmalloc_no_huge);
3017+
30013018
/**
30023019
* vzalloc - allocate virtually contiguous memory with zero fill
30033020
* @size: allocation size

0 commit comments

Comments
 (0)