Re: [PATCH v12 2/5] mm/vmalloc: use physical page count for vrealloc() grow-in-place check

From: Uladzislau Rezki

Date: Wed May 06 2026 - 14:47:31 EST


On Tue, Apr 28, 2026 at 01:54:17AM +0530, Shivam Kalra via B4 Relay wrote:
> From: Shivam Kalra <shivamkalra98@xxxxxxxxxxx>
>
> Update the grow-in-place check in vrealloc() to compare the requested size
> against the actual physical page count (vm->nr_pages) rather than the
> virtual area size (alloced_size, derived from get_vm_area_size()).
>
> Currently both values are equivalent, but the upcoming vrealloc() shrink
> functionality will free pages without reducing the virtual reservation
> size. After such a shrink, the old alloced_size-based comparison would
> incorrectly allow a grow-in-place operation to succeed and attempt to
> access freed pages. Switch to vm->nr_pages now so the check remains
> correct once shrink support is added.
>
> Signed-off-by: Shivam Kalra <shivamkalra98@xxxxxxxxxxx>
> ---
> mm/vmalloc.c | 8 +++++++-
> 1 file changed, 7 insertions(+), 1 deletion(-)
>
> diff --git a/mm/vmalloc.c b/mm/vmalloc.c
> index 1073abb6094e..9cb3e287a1e8 100644
> --- a/mm/vmalloc.c
> +++ b/mm/vmalloc.c
> @@ -4338,6 +4338,12 @@ void *vrealloc_node_align_noprof(const void *p, size_t size, unsigned long align
> if (unlikely(flags & __GFP_THISNODE) && nid != NUMA_NO_NODE &&
> nid != page_to_nid(vmalloc_to_page(p)))
> goto need_realloc;
> + } else {
> + /*
> + * If p is NULL, vrealloc behaves exactly like vmalloc.
> + * Skip the shrink and in-place grow paths.
> + */
> + goto need_realloc;
> }
>
> /*
> @@ -4356,7 +4362,7 @@ void *vrealloc_node_align_noprof(const void *p, size_t size, unsigned long align
> /*
> * We already have the bytes available in the allocation; use them.
> */
> - if (size <= alloced_size) {
> + if (size <= vm->nr_pages << PAGE_SHIFT) {
> /*
>
Maybe we should consider Fujunjie approach and borrow his idea to shrink VA also?
In that case, we do not need to switch to vm->nr_pages? And we do not
need

[PATCH v12 3/5] mm/vmalloc: use physical page count in vread_iter()

?

--
Uladzislau Rezki