Message ID | 20250312151634.2183278-20-bigeasy@linutronix.de (mailing list archive) |
---|---|
State | New |
Headers | show |
Series | None | expand |
On Wed, 12 Mar 2025 16:16:32 +0100 Sebastian Andrzej Siewior <bigeasy@linutronix.de> wrote: > From: Peter Zijlstra <peterz@infradead.org> > > To enable node specific hash-tables. "... using huge pages if possible"? > --- a/mm/vmalloc.c > +++ b/mm/vmalloc.c > @@ -3966,6 +3966,13 @@ void *vmalloc_huge_noprof(unsigned long size, gfp_t gfp_mask) > } > EXPORT_SYMBOL_GPL(vmalloc_huge_noprof); > > +void *vmalloc_huge_node_noprof(unsigned long size, gfp_t gfp_mask, int node) > +{ > + return __vmalloc_node_range_noprof(size, 1, VMALLOC_START, VMALLOC_END, > + gfp_mask, PAGE_KERNEL, VM_ALLOW_HUGE_VMAP, > + node, __builtin_return_address(0)); > +} > + kerneldoc please? I suppose we can now simplify vmalloc_huge_noprof() to use this: static inline void *vmalloc_huge_noprof(unsigned long size, gfp_t gfp_mask) { return vmalloc_huge_node_noprof(size, gfp_mask, NUMA_NO_NODE); }
On 2025-03-12 15:02:06 [-0700], Andrew Morton wrote: > On Wed, 12 Mar 2025 16:16:32 +0100 Sebastian Andrzej Siewior <bigeasy@linutronix.de> wrote: > > > From: Peter Zijlstra <peterz@infradead.org> > > > > To enable node specific hash-tables. > > "... using huge pages if possible"? > > > --- a/mm/vmalloc.c > > +++ b/mm/vmalloc.c > > @@ -3966,6 +3966,13 @@ void *vmalloc_huge_noprof(unsigned long size, gfp_t gfp_mask) > > } > > EXPORT_SYMBOL_GPL(vmalloc_huge_noprof); > > > > +void *vmalloc_huge_node_noprof(unsigned long size, gfp_t gfp_mask, int node) > > +{ > > + return __vmalloc_node_range_noprof(size, 1, VMALLOC_START, VMALLOC_END, > > + gfp_mask, PAGE_KERNEL, VM_ALLOW_HUGE_VMAP, > > + node, __builtin_return_address(0)); > > +} > > + > > kerneldoc please? Okay. > > I suppose we can now simplify vmalloc_huge_noprof() to use this: > > static inline void *vmalloc_huge_noprof(unsigned long size, gfp_t gfp_mask) > { > return vmalloc_huge_node_noprof(size, gfp_mask, NUMA_NO_NODE); > } Do you want me to stash this into this one or as a follow up? Sebastian
On Thu, 13 Mar 2025 08:59:24 +0100 Sebastian Andrzej Siewior <bigeasy@linutronix.de> wrote: > > > > I suppose we can now simplify vmalloc_huge_noprof() to use this: > > > > static inline void *vmalloc_huge_noprof(unsigned long size, gfp_t gfp_mask) > > { > > return vmalloc_huge_node_noprof(size, gfp_mask, NUMA_NO_NODE); > > } > > Do you want me to stash this into this one or as a follow up? That would be nice, if you think it makes sense. There is some duplication here.
On 2025-03-13 15:08:14 [-0700], Andrew Morton wrote: > That would be nice, if you think it makes sense. There is some > duplication here. As you wish. That would be the following patch below. This is now somehow unique compared to the other interfaces (like vmalloc() vs vmalloc_node()). -------------------->8------------- From: Peter Zijlstra <peterz@infradead.org> Date: Fri, 14 Jul 2023 12:45:01 +0200 Subject: [PATCH] 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] Cc: Andrew Morton <akpm@linux-foundation.org> Cc: Uladzislau Rezki <urezki@gmail.com> Cc: Christoph Hellwig <hch@infradead.org> Cc: linux-mm@kvack.org Signed-off-by: Peter Zijlstra (Intel) <peterz@infradead.org> Reviewed-by: Christoph Hellwig <hch@lst.de> Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de> --- include/linux/vmalloc.h | 9 +++++++-- mm/nommu.c | 18 +++++++++++++++++- mm/vmalloc.c | 11 ++++++----- 3 files changed, 30 insertions(+), 8 deletions(-) diff --git a/include/linux/vmalloc.h b/include/linux/vmalloc.h index 31e9ffd936e39..de95794777ad6 100644 --- a/include/linux/vmalloc.h +++ b/include/linux/vmalloc.h @@ -168,8 +168,13 @@ void *__vmalloc_node_noprof(unsigned long size, unsigned long align, gfp_t gfp_m int node, const void *caller) __alloc_size(1); #define __vmalloc_node(...) alloc_hooks(__vmalloc_node_noprof(__VA_ARGS__)) -void *vmalloc_huge_noprof(unsigned long size, gfp_t gfp_mask) __alloc_size(1); -#define vmalloc_huge(...) alloc_hooks(vmalloc_huge_noprof(__VA_ARGS__)) +void *vmalloc_huge_node_noprof(unsigned long size, gfp_t gfp_mask, int node) __alloc_size(1); +#define vmalloc_huge_node(...) alloc_hooks(vmalloc_huge_node_noprof(__VA_ARGS__)) + +static inline void *vmalloc_huge(unsigned long size, gfp_t gfp_mask) +{ + return vmalloc_huge_node(size, gfp_mask, NUMA_NO_NODE); +} extern void *__vmalloc_array_noprof(size_t n, size_t size, gfp_t flags) __alloc_size(1, 2); #define __vmalloc_array(...) alloc_hooks(__vmalloc_array_noprof(__VA_ARGS__)) diff --git a/mm/nommu.c b/mm/nommu.c index baa79abdaf037..aed58ea7398db 100644 --- a/mm/nommu.c +++ b/mm/nommu.c @@ -207,7 +207,23 @@ void *vmalloc_noprof(unsigned long size) } EXPORT_SYMBOL(vmalloc_noprof); -void *vmalloc_huge_noprof(unsigned long size, gfp_t gfp_mask) __weak __alias(__vmalloc_noprof); +/* + * vmalloc_huge_node - allocate virtually contiguous memory, on a node + * + * @size: allocation size + * @gfp_mask: flags for the page level allocator + * @node: node to use for allocation or NUMA_NO_NODE + * + * Allocate enough pages to cover @size from the page level + * allocator and map them into contiguous kernel virtual space. + * + * Due to NOMMU implications the node argument and HUGE page attribute is + * ignored. + */ +void *vmalloc_huge_node_noprof(unsigned long size, gfp_t gfp_mask, int node) +{ + return __vmalloc_noprof(size, gfp_mask); +} /* * vzalloc - allocate virtually contiguous memory with zero fill diff --git a/mm/vmalloc.c b/mm/vmalloc.c index a6e7acebe9adf..0e2c49aaf84f1 100644 --- a/mm/vmalloc.c +++ b/mm/vmalloc.c @@ -3947,9 +3947,10 @@ void *vmalloc_noprof(unsigned long size) EXPORT_SYMBOL(vmalloc_noprof); /** - * vmalloc_huge - allocate virtually contiguous memory, allow huge pages + * vmalloc_huge_node - allocate virtually contiguous memory, allow huge pages * @size: allocation size * @gfp_mask: flags for the page level allocator + * @node: node to use for allocation or NUMA_NO_NODE * * Allocate enough pages to cover @size from the page level * allocator and map them into contiguous kernel virtual space. @@ -3958,13 +3959,13 @@ EXPORT_SYMBOL(vmalloc_noprof); * * Return: pointer to the allocated memory or %NULL on error */ -void *vmalloc_huge_noprof(unsigned long size, gfp_t gfp_mask) +void *vmalloc_huge_node_noprof(unsigned long size, gfp_t gfp_mask, int node) { return __vmalloc_node_range_noprof(size, 1, VMALLOC_START, VMALLOC_END, - gfp_mask, PAGE_KERNEL, VM_ALLOW_HUGE_VMAP, - NUMA_NO_NODE, __builtin_return_address(0)); + gfp_mask, PAGE_KERNEL, VM_ALLOW_HUGE_VMAP, + node, __builtin_return_address(0)); } -EXPORT_SYMBOL_GPL(vmalloc_huge_noprof); +EXPORT_SYMBOL_GPL(vmalloc_huge_node_noprof); /** * vzalloc - allocate virtually contiguous memory with zero fill
On Fri, 14 Mar 2025 10:59:31 +0100 Sebastian Andrzej Siewior <bigeasy@linutronix.de> wrote: > On 2025-03-13 15:08:14 [-0700], Andrew Morton wrote: > > That would be nice, if you think it makes sense. There is some > > duplication here. > > As you wish. That would be the following patch below. Looks OK. > This is now > somehow unique compared to the other interfaces (like vmalloc() vs > vmalloc_node()). I'm not sure what this means? I kinda struggle with the name "vmalloc_huge_node". But "vmalloc_node_maybe_huge" is too long! > --- a/mm/nommu.c > +++ b/mm/nommu.c > @@ -207,7 +207,23 @@ void *vmalloc_noprof(unsigned long size) > } > EXPORT_SYMBOL(vmalloc_noprof); > > -void *vmalloc_huge_noprof(unsigned long size, gfp_t gfp_mask) __weak __alias(__vmalloc_noprof); > +/* > + * vmalloc_huge_node - allocate virtually contiguous memory, on a node > + * > + * @size: allocation size > + * @gfp_mask: flags for the page level allocator > + * @node: node to use for allocation or NUMA_NO_NODE > + * > + * Allocate enough pages to cover @size from the page level > + * allocator and map them into contiguous kernel virtual space. > + * > + * Due to NOMMU implications the node argument and HUGE page attribute is > + * ignored. > + */ > +void *vmalloc_huge_node_noprof(unsigned long size, gfp_t gfp_mask, int node) > +{ > + return __vmalloc_noprof(size, gfp_mask); > +} Please check, I think this wants to be EXPORTed to modules. > -void *vmalloc_huge_noprof(unsigned long size, gfp_t gfp_mask) > +void *vmalloc_huge_node_noprof(unsigned long size, gfp_t gfp_mask, int node) > { > return __vmalloc_node_range_noprof(size, 1, VMALLOC_START, VMALLOC_END, > - gfp_mask, PAGE_KERNEL, VM_ALLOW_HUGE_VMAP, > - NUMA_NO_NODE, __builtin_return_address(0)); > + gfp_mask, PAGE_KERNEL, VM_ALLOW_HUGE_VMAP, > + node, __builtin_return_address(0)); > } > -EXPORT_SYMBOL_GPL(vmalloc_huge_noprof); > +EXPORT_SYMBOL_GPL(vmalloc_huge_node_noprof); Like the NOMMU=n version.
diff --git a/include/linux/vmalloc.h b/include/linux/vmalloc.h index 31e9ffd936e39..09c3e3e33f1f8 100644 --- a/include/linux/vmalloc.h +++ b/include/linux/vmalloc.h @@ -171,6 +171,9 @@ void *__vmalloc_node_noprof(unsigned long size, unsigned long align, gfp_t gfp_m void *vmalloc_huge_noprof(unsigned long size, gfp_t gfp_mask) __alloc_size(1); #define vmalloc_huge(...) alloc_hooks(vmalloc_huge_noprof(__VA_ARGS__)) +void *vmalloc_huge_node_noprof(unsigned long size, gfp_t gfp_mask, int node) __alloc_size(1); +#define vmalloc_huge_node(...) alloc_hooks(vmalloc_huge_node_noprof(__VA_ARGS__)) + extern void *__vmalloc_array_noprof(size_t n, size_t size, gfp_t flags) __alloc_size(1, 2); #define __vmalloc_array(...) alloc_hooks(__vmalloc_array_noprof(__VA_ARGS__)) diff --git a/mm/nommu.c b/mm/nommu.c index baa79abdaf037..d04e601a8f4d7 100644 --- a/mm/nommu.c +++ b/mm/nommu.c @@ -209,6 +209,11 @@ EXPORT_SYMBOL(vmalloc_noprof); void *vmalloc_huge_noprof(unsigned long size, gfp_t gfp_mask) __weak __alias(__vmalloc_noprof); +void *vmalloc_huge_node_noprof(unsigned long size, gfp_t gfp_mask, int node) +{ + return vmalloc_huge_noprof(size, gfp_mask); +} + /* * vzalloc - allocate virtually contiguous memory with zero fill * diff --git a/mm/vmalloc.c b/mm/vmalloc.c index a6e7acebe9adf..69247b46413ca 100644 --- a/mm/vmalloc.c +++ b/mm/vmalloc.c @@ -3966,6 +3966,13 @@ void *vmalloc_huge_noprof(unsigned long size, gfp_t gfp_mask) } EXPORT_SYMBOL_GPL(vmalloc_huge_noprof); +void *vmalloc_huge_node_noprof(unsigned long size, gfp_t gfp_mask, int node) +{ + return __vmalloc_node_range_noprof(size, 1, VMALLOC_START, VMALLOC_END, + gfp_mask, PAGE_KERNEL, VM_ALLOW_HUGE_VMAP, + node, __builtin_return_address(0)); +} + /** * vzalloc - allocate virtually contiguous memory with zero fill * @size: allocation size