> On Jul 9, 2025, at 9:01 PM, Liam R. Howlett wrote: > > * Vitaly Wool > [250709 13:24]: >> Reimplement vrealloc() to be able to set node and alignment should >> a user need to do so. Rename the function to vrealloc_node_align() >> to better match what it actually does now and introduce macros for >> vrealloc() and friends for backward compatibility. >> >> With that change we also provide the ability for the Rust part of >> the kernel to set node and alignment in its allocations. >> >> Signed-off-by: Vitaly Wool >> Reviewed-by: Uladzislau Rezki (Sony) >> Reviewed-by: Vlastimil Babka >> --- >> include/linux/vmalloc.h | 12 +++++++++--- >> mm/nommu.c | 3 ++- >> mm/vmalloc.c | 31 ++++++++++++++++++++++++++----- >> 3 files changed, 37 insertions(+), 9 deletions(-) >> > ... > >> diff --git a/mm/vmalloc.c b/mm/vmalloc.c >> index 6dbcdceecae1..03dd06097b25 100644 >> --- a/mm/vmalloc.c >> +++ b/mm/vmalloc.c >> @@ -4089,19 +4089,31 @@ void *vzalloc_node_noprof(unsigned long size, int node) >> EXPORT_SYMBOL(vzalloc_node_noprof); >> >> /** >> - * vrealloc - reallocate virtually contiguous memory; contents remain unchanged >> + * vrealloc_node_align_noprof - reallocate virtually contiguous memory; contents >> + * remain unchanged >> * @p: object to reallocate memory for >> * @size: the size to reallocate >> + * @align: requested alignment >> * @flags: the flags for the page level allocator >> + * @nid: node number of the target node >> + * >> + * If @p is %NULL, vrealloc_XXX() behaves exactly like vmalloc(). If @size is >> + * 0 and @p is not a %NULL pointer, the object pointed to is freed. >> * >> - * If @p is %NULL, vrealloc() behaves exactly like vmalloc(). If @size is 0 and >> - * @p is not a %NULL pointer, the object pointed to is freed. >> + * if @nid is not NUMA_NO_NODE, this function will try to allocate memory on >> + * the given node. If reallocation is not necessary (e. g. the new size is less >> + * than the current allocated size), the current allocation will be preserved >> + * unless __GFP_THISNODE is set. In the latter case a new allocation on the >> + * requested node will be attempted. > > I am having a very hard time understanding what you mean here. What is > the latter case? > > If @nis is !NUMA_NO_NODE, the allocation will be attempted on the given > node. Then things sort of get confusing. What is the latter case? The latter case is __GFP_THISNODE present in flags. That’s the latest if-clause in this paragraph. > >> * >> * If __GFP_ZERO logic is requested, callers must ensure that, starting with the >> * initial memory allocation, every subsequent call to this API for the same >> * memory allocation is flagged with __GFP_ZERO. Otherwise, it is possible that >> * __GFP_ZERO is not fully honored by this API. >> * >> + * If the requested alignment is bigger than the one the *existing* allocation >> + * has, this function will fail. >> + * > > It might be better to say something like: > Requesting an alignment that is bigger than the alignment of the > *existing* allocation will fail. > The whole function description in fact consists of several if-clauses (some of which are nested) so I am just following the pattern here. ~Vitaly