From: Vlastimil Babka <vbabka@suse.cz>
To: Danilo Krummrich <dakr@kernel.org>,
cl@linux.com, penberg@kernel.org, rientjes@google.com,
iamjoonsoo.kim@lge.com, akpm@linux-foundation.org,
roman.gushchin@linux.dev, 42.hyeyoo@gmail.com, urezki@gmail.com,
hch@infradead.org, kees@kernel.org, ojeda@kernel.org,
wedsonaf@gmail.com, mhocko@kernel.org, mpe@ellerman.id.au,
chandan.babu@oracle.com, christian.koenig@amd.com,
maz@kernel.org, oliver.upton@linux.dev
Cc: linux-kernel@vger.kernel.org, linux-mm@kvack.org,
rust-for-linux@vger.kernel.org
Subject: Re: [PATCH v2 1/2] mm: vmalloc: implement vrealloc()
Date: Fri, 26 Jul 2024 16:37:43 +0200 [thread overview]
Message-ID: <07491799-9753-4fc9-b642-6d7d7d9575aa@suse.cz> (raw)
In-Reply-To: <20240722163111.4766-2-dakr@kernel.org>
On 7/22/24 6:29 PM, Danilo Krummrich wrote:
> Implement vrealloc() analogous to krealloc().
>
> Currently, krealloc() requires the caller to pass the size of the
> previous memory allocation, which, instead, should be self-contained.
>
> We attempt to fix this in a subsequent patch which, in order to do so,
> requires vrealloc().
>
> Besides that, we need realloc() functions for kernel allocators in Rust
> too. With `Vec` or `KVec` respectively, potentially growing (and
> shrinking) data structures are rather common.
>
> Signed-off-by: Danilo Krummrich <dakr@kernel.org>
Acked-by: Vlastimil Babka <vbabka@suse.cz>
> --- a/mm/vmalloc.c
> +++ b/mm/vmalloc.c
> @@ -4037,6 +4037,65 @@ void *vzalloc_node_noprof(unsigned long size, int node)
> }
> EXPORT_SYMBOL(vzalloc_node_noprof);
>
> +/**
> + * vrealloc - reallocate virtually contiguous memory; contents remain unchanged
> + * @p: object to reallocate memory for
> + * @size: the size to reallocate
> + * @flags: the flags for the page level allocator
> + *
> + * The contents of the object pointed to are preserved up to the lesser of the
> + * new and old size (__GFP_ZERO flag is effectively ignored).
Well, technically not correct as we don't shrink. Get 8 pages, kvrealloc to
4 pages, kvrealloc back to 8 and the last 4 are not zeroed. But it's not
new, kvrealloc() did the same before patch 2/2.
But it's also fundamentally not true for krealloc(), or kvrealloc()
switching from a kmalloc to valloc. ksize() returns the size of the kmalloc
bucket, we don't know what was the exact prior allocation size. Worse, we
started poisoning the padding in debug configurations, so even a
kmalloc(__GFP_ZERO) followed by krealloc(__GFP_ZERO) can give you unexpected
poison now...
I guess we should just document __GFP_ZERO is not honored at all for
realloc, and maybe start even warning :/ Hopefully nobody relies on that.
> + *
> + * 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.
> + *
> + * Return: pointer to the allocated memory; %NULL if @size is zero or in case of
> + * failure
> + */
> +void *vrealloc_noprof(const void *p, size_t size, gfp_t flags)
> +{
> + size_t old_size = 0;
> + void *n;
> +
> + if (!size) {
> + vfree(p);
> + return NULL;
> + }
> +
> + if (p) {
> + struct vm_struct *vm;
> +
> + vm = find_vm_area(p);
> + if (unlikely(!vm)) {
> + WARN(1, "Trying to vrealloc() nonexistent vm area (%p)\n", p);
> + return NULL;
> + }
> +
> + old_size = get_vm_area_size(vm);
> + }
> +
> + if (size <= old_size) {
> + /*
> + * TODO: Shrink the vm_area, i.e. unmap and free unused pages.
> + * What would be a good heuristic for when to shrink the
> + * vm_area?
> + */
> + return (void *)p;
> + }
> +
> + /* TODO: Grow the vm_area, i.e. allocate and map additional pages. */
> + n = __vmalloc_noprof(size, flags);
> + if (!n)
> + return NULL;
> +
> + if (p) {
> + memcpy(n, p, old_size);
> + vfree(p);
> + }
> +
> + return n;
> +}
> +
> #if defined(CONFIG_64BIT) && defined(CONFIG_ZONE_DMA32)
> #define GFP_VMALLOC32 (GFP_DMA32 | GFP_KERNEL)
> #elif defined(CONFIG_64BIT) && defined(CONFIG_ZONE_DMA)
next prev parent reply other threads:[~2024-07-26 14:37 UTC|newest]
Thread overview: 28+ messages / expand[flat|nested] mbox.gz Atom feed top
2024-07-22 16:29 [PATCH v2 0/2] Align kvrealloc() with krealloc() Danilo Krummrich
2024-07-22 16:29 ` [PATCH v2 1/2] mm: vmalloc: implement vrealloc() Danilo Krummrich
2024-07-26 14:37 ` Vlastimil Babka [this message]
2024-07-26 20:05 ` Danilo Krummrich
2024-07-29 19:08 ` Danilo Krummrich
2024-07-30 1:35 ` Danilo Krummrich
2024-07-30 12:15 ` Vlastimil Babka
2024-07-30 13:14 ` Danilo Krummrich
2024-07-30 13:58 ` Vlastimil Babka
2024-07-30 14:32 ` Danilo Krummrich
2024-09-02 1:36 ` Feng Tang
2024-09-02 7:04 ` Feng Tang
2024-09-02 8:56 ` Vlastimil Babka
2024-09-03 3:18 ` Feng Tang
2024-09-06 7:35 ` Feng Tang
2024-07-22 16:29 ` [PATCH v2 2/2] mm: kvmalloc: align kvrealloc() with krealloc() Danilo Krummrich
2024-07-23 1:43 ` Andrew Morton
2024-07-23 14:05 ` Danilo Krummrich
2024-07-23 7:50 ` Michal Hocko
2024-07-23 10:42 ` Danilo Krummrich
2024-07-23 10:55 ` Michal Hocko
2024-07-23 11:55 ` Danilo Krummrich
2024-07-23 12:12 ` Michal Hocko
2024-07-23 13:33 ` Danilo Krummrich
2024-07-23 18:53 ` Michal Hocko
2024-07-26 14:38 ` Vlastimil Babka
2024-07-23 18:54 ` [PATCH v2 0/2] Align " Michal Hocko
2024-07-23 18:56 ` Danilo Krummrich
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=07491799-9753-4fc9-b642-6d7d7d9575aa@suse.cz \
--to=vbabka@suse.cz \
--cc=42.hyeyoo@gmail.com \
--cc=akpm@linux-foundation.org \
--cc=chandan.babu@oracle.com \
--cc=christian.koenig@amd.com \
--cc=cl@linux.com \
--cc=dakr@kernel.org \
--cc=hch@infradead.org \
--cc=iamjoonsoo.kim@lge.com \
--cc=kees@kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-mm@kvack.org \
--cc=maz@kernel.org \
--cc=mhocko@kernel.org \
--cc=mpe@ellerman.id.au \
--cc=ojeda@kernel.org \
--cc=oliver.upton@linux.dev \
--cc=penberg@kernel.org \
--cc=rientjes@google.com \
--cc=roman.gushchin@linux.dev \
--cc=rust-for-linux@vger.kernel.org \
--cc=urezki@gmail.com \
--cc=wedsonaf@gmail.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox