Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux
1
fork

Configure Feed

Select the types of activity you want to include in your feed.

mm: Add vmalloc_huge_node()

To enable node specific hash-tables using huge pages if possible.

[bigeasy: use __vmalloc_node_range_noprof(), add nommu bits, inline
vmalloc_huge]

Signed-off-by: Peter Zijlstra (Intel) <peterz@infradead.org>
Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
Signed-off-by: Peter Zijlstra (Intel) <peterz@infradead.org>
Reviewed-by: Christoph Hellwig <hch@lst.de>
Link: https://lore.kernel.org/r/20250416162921.513656-3-bigeasy@linutronix.de

+30 -8
+7 -2
include/linux/vmalloc.h
··· 168 168 int node, const void *caller) __alloc_size(1); 169 169 #define __vmalloc_node(...) alloc_hooks(__vmalloc_node_noprof(__VA_ARGS__)) 170 170 171 - void *vmalloc_huge_noprof(unsigned long size, gfp_t gfp_mask) __alloc_size(1); 172 - #define vmalloc_huge(...) alloc_hooks(vmalloc_huge_noprof(__VA_ARGS__)) 171 + void *vmalloc_huge_node_noprof(unsigned long size, gfp_t gfp_mask, int node) __alloc_size(1); 172 + #define vmalloc_huge_node(...) alloc_hooks(vmalloc_huge_node_noprof(__VA_ARGS__)) 173 + 174 + static inline void *vmalloc_huge(unsigned long size, gfp_t gfp_mask) 175 + { 176 + return vmalloc_huge_node(size, gfp_mask, NUMA_NO_NODE); 177 + } 173 178 174 179 extern void *__vmalloc_array_noprof(size_t n, size_t size, gfp_t flags) __alloc_size(1, 2); 175 180 #define __vmalloc_array(...) alloc_hooks(__vmalloc_array_noprof(__VA_ARGS__))
+17 -1
mm/nommu.c
··· 200 200 } 201 201 EXPORT_SYMBOL(vmalloc_noprof); 202 202 203 - void *vmalloc_huge_noprof(unsigned long size, gfp_t gfp_mask) __weak __alias(__vmalloc_noprof); 203 + /* 204 + * vmalloc_huge_node - allocate virtually contiguous memory, on a node 205 + * 206 + * @size: allocation size 207 + * @gfp_mask: flags for the page level allocator 208 + * @node: node to use for allocation or NUMA_NO_NODE 209 + * 210 + * Allocate enough pages to cover @size from the page level 211 + * allocator and map them into contiguous kernel virtual space. 212 + * 213 + * Due to NOMMU implications the node argument and HUGE page attribute is 214 + * ignored. 215 + */ 216 + void *vmalloc_huge_node_noprof(unsigned long size, gfp_t gfp_mask, int node) 217 + { 218 + return __vmalloc_noprof(size, gfp_mask); 219 + } 204 220 205 221 /* 206 222 * vzalloc - allocate virtually contiguous memory with zero fill
+6 -5
mm/vmalloc.c
··· 3943 3943 EXPORT_SYMBOL(vmalloc_noprof); 3944 3944 3945 3945 /** 3946 - * vmalloc_huge - allocate virtually contiguous memory, allow huge pages 3946 + * vmalloc_huge_node - allocate virtually contiguous memory, allow huge pages 3947 3947 * @size: allocation size 3948 3948 * @gfp_mask: flags for the page level allocator 3949 + * @node: node to use for allocation or NUMA_NO_NODE 3949 3950 * 3950 3951 * Allocate enough pages to cover @size from the page level 3951 3952 * allocator and map them into contiguous kernel virtual space. ··· 3955 3954 * 3956 3955 * Return: pointer to the allocated memory or %NULL on error 3957 3956 */ 3958 - void *vmalloc_huge_noprof(unsigned long size, gfp_t gfp_mask) 3957 + void *vmalloc_huge_node_noprof(unsigned long size, gfp_t gfp_mask, int node) 3959 3958 { 3960 3959 return __vmalloc_node_range_noprof(size, 1, VMALLOC_START, VMALLOC_END, 3961 - gfp_mask, PAGE_KERNEL, VM_ALLOW_HUGE_VMAP, 3962 - NUMA_NO_NODE, __builtin_return_address(0)); 3960 + gfp_mask, PAGE_KERNEL, VM_ALLOW_HUGE_VMAP, 3961 + node, __builtin_return_address(0)); 3963 3962 } 3964 - EXPORT_SYMBOL_GPL(vmalloc_huge_noprof); 3963 + EXPORT_SYMBOL_GPL(vmalloc_huge_node_noprof); 3965 3964 3966 3965 /** 3967 3966 * vzalloc - allocate virtually contiguous memory with zero fill