From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from kanga.kvack.org (kanga.kvack.org [205.233.56.17]) by smtp.lore.kernel.org (Postfix) with ESMTP id 66DA5C8302D for ; Mon, 30 Jun 2025 11:50:37 +0000 (UTC) Received: by kanga.kvack.org (Postfix) id 0A39D6B00AE; Mon, 30 Jun 2025 07:50:37 -0400 (EDT) Received: by kanga.kvack.org (Postfix, from userid 40) id 07A176B00AF; Mon, 30 Jun 2025 07:50:37 -0400 (EDT) X-Delivered-To: int-list-linux-mm@kvack.org Received: by kanga.kvack.org (Postfix, from userid 63042) id EAAAD6B00B0; Mon, 30 Jun 2025 07:50:36 -0400 (EDT) X-Delivered-To: linux-mm@kvack.org Received: from relay.hostedemail.com (smtprelay0017.hostedemail.com [216.40.44.17]) by kanga.kvack.org (Postfix) with ESMTP id D745F6B00AE for ; Mon, 30 Jun 2025 07:50:36 -0400 (EDT) Received: from smtpin14.hostedemail.com (a10.router.float.18 [10.200.18.1]) by unirelay07.hostedemail.com (Postfix) with ESMTP id A165C160439 for ; Mon, 30 Jun 2025 11:50:36 +0000 (UTC) X-FDA: 83611899672.14.202B183 Received: from mailrelay5-3.pub.mailoutpod3-cph3.one.com (mailrelay5-3.pub.mailoutpod3-cph3.one.com [46.30.212.10]) by imf09.hostedemail.com (Postfix) with ESMTP id 1D5AC140006 for ; Mon, 30 Jun 2025 11:50:33 +0000 (UTC) Authentication-Results: imf09.hostedemail.com; dkim=pass header.d=konsulko.se header.s=rsa1 header.b=cxDSU5gF; dkim=pass header.d=konsulko.se header.s=ed1 header.b=sysh97sg ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=hostedemail.com; s=arc-20220608; t=1751284234; h=from:from:sender:reply-to:subject:subject:date:date: message-id:message-id:to:to:cc:cc:mime-version:mime-version: content-type:content-type:content-transfer-encoding: in-reply-to:in-reply-to:references:references:dkim-signature; bh=z9EkL1TZZC3EDklv8sX0Q4v1Myi1GSEUIGLzsYVESQo=; b=7VM1yS2yZyj+FTSEQg72J3MMBlbMMeQLRI19MGi2P2+B7v1vSAW1gOSv5XhTlchbsw7WUO ux1Ddu5hcEY/wvlJDlLeDfeyPoB/IiciFT+G90t6qMw0DUK3Y4afYuPjnCBaNOvmCS2liY GMxYaIpr0Pcog4RgHQmkmmk0AepDFNw= ARC-Authentication-Results: i=1; imf09.hostedemail.com; dkim=pass header.d=konsulko.se header.s=rsa1 header.b=cxDSU5gF; dkim=pass header.d=konsulko.se header.s=ed1 header.b=sysh97sg; spf=none (imf09.hostedemail.com: domain of vitaly.wool@konsulko.se has no SPF policy when checking 46.30.212.10) smtp.mailfrom=vitaly.wool@konsulko.se; dmarc=none ARC-Seal: i=1; s=arc-20220608; d=hostedemail.com; t=1751284234; a=rsa-sha256; cv=none; b=JD1g1n0z4HF3rX7RUAM3sblJ0eYkdf9S+6LAGiAwfp2t3k+j1UtOLfIaO52D/GCZAfugvd LDN1Whx6tOiYodEHLxCYtg6phaIUMvOnYdIGqkWqGyitW+JfhBMpt9usHaFkqaiRY8zdZL iEfyKm1X4LBrEDEQxIVC6llPiZckIxc= DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; t=1751284231; x=1751889031; d=konsulko.se; s=rsa1; h=references:to:cc:in-reply-to:date:subject:mime-version:content-type: message-id:from:from; bh=z9EkL1TZZC3EDklv8sX0Q4v1Myi1GSEUIGLzsYVESQo=; b=cxDSU5gFEW7U/WqZa61hBelsncjwxxGUiPIzbKMJ0jSgzVRhXVYnaO2Sq3NDojWyR1VrbYYtOLNg1 mn3e9fqex68QDNP6JGmCb7BnzZ0+QC02fKiGfYQwy2yys124RggPPgg995MMf7lieawWAYdOcgAsdT /ED0h8n/rApWxroUFpEoF+5qr7F97JLXwzFc7udllc4alZBatyBCqSSRBW3WINaVECUPUuZ3Xb1NWk EGNFoqPn+v71tMjaf768dUOhWf2uVaYwAUJ0Q5o5lGL9kBkiCFfEbIkd1DMgjKX64AC5RgUNLahUqH bzs2cec/HWfJfnlvxAF5SBKvHXk6prQ== DKIM-Signature: v=1; a=ed25519-sha256; c=relaxed/relaxed; t=1751284231; x=1751889031; d=konsulko.se; s=ed1; h=references:to:cc:in-reply-to:date:subject:mime-version:content-type: message-id:from:from; bh=z9EkL1TZZC3EDklv8sX0Q4v1Myi1GSEUIGLzsYVESQo=; b=sysh97sg/oyfMyFrRT4qelOo8t6rjw/EfcPcZ6T7pMzyjdVhDyoScVVafFuPxwBKO2ibgTYc5C529 PUxUnCgBg== X-HalOne-ID: 6bd0f7f8-55a8-11f0-9ab6-d7c209f8bd06 Received: from smtpclient.apple (c188-150-224-8.bredband.tele2.se [188.150.224.8]) by mailrelay5.pub.mailoutpod3-cph3.one.com (Halon) with ESMTPSA id 6bd0f7f8-55a8-11f0-9ab6-d7c209f8bd06; Mon, 30 Jun 2025 11:50:31 +0000 (UTC) From: Vitaly Wool Message-Id: <9E9F1FCB-E4BF-463B-B2C3-833572B3918A@konsulko.se> Content-Type: multipart/alternative; boundary="Apple-Mail=_BCE844C3-88DD-44DB-8610-874CA9F71D0D" Mime-Version: 1.0 (Mac OS X Mail 16.0 \(3826.200.121\)) Subject: Re: [PATCH v8 1/4] mm/vmalloc: allow to set node and align in vrealloc Date: Mon, 30 Jun 2025 13:50:20 +0200 In-Reply-To: Cc: linux-mm@kvack.org, akpm@linux-foundation.org, linux-kernel@vger.kernel.org, Danilo Krummrich , Alice Ryhl , rust-for-linux@vger.kernel.org To: Uladzislau Rezki References: <20250628102315.2542656-1-vitaly.wool@konsulko.se> <20250628102537.2542789-1-vitaly.wool@konsulko.se> X-Mailer: Apple Mail (2.3826.200.121) X-Rspam-User: X-Rspamd-Server: rspam05 X-Rspamd-Queue-Id: 1D5AC140006 X-Stat-Signature: qjgchyuqujq3o415wixschsnuqzbzyrz X-HE-Tag: 1751284233-338077 X-HE-Meta: U2FsdGVkX1/C95z+PsOTdB9TKYJh64QDArLIVV7AWaA0clxNpnkE1IkmULGTMKgRpvReFv2KS0sV8UkkjDO4i74PQnjxpc4J/k6HBPehm+THnSdZSypIGWxwK055Fi5g/HsPDnRBGQdPAxg0+TPh4lwtgrpb1E6z94Hm7HEDmLTdr5SC2VXPQSjAhvm30Sq0u9P65mOuVejQheRADjKm1XyPtCjB0TL3qJeXXZvG8Vs4CosH/13rwbW20KXyMqPz7EuldlVHkipGZuG3KTUWXMzPbthzBqrrnTG/1D125Npd34F8+DKEyVnG2/nW/3F9l9NK3JOEw+2J70PIcdGoPmOIvdimk4vk1h1WV5tsjwqKtormwmd91mWIy49JYg6aghbupyblAGBXqKSqnlSBsypYaFyEa9D8q8YgWcBp/239MXciJsev7AH5dJQ7Ns+oiLY6oEvuFExVOesQeOCOpWrOXUy8ZUeq+PQUqrUQ7KLfh1KPizlqdI/4AJ4EyQPQISyS3CI70E6gS2O/70NK/Mf0ORupON7AM8v5J8NegPcCcVDHh1oCdo325P6J3/TauHSOAChU04MNtG3h42/TVh+il1KHN0VbyDaBl3SJsbMYd6ojkez/Ls5cWPyVDMaIRGFCHs/NaVfjRu6UWr3iCmlD0e8STDVix1niM0ju3/Am7rDHefGGx1mcHrfbiLgT6/4ZeoYN8pTLqgjj6XpVXVRJq8WBAWk+RHlgPue1hz4e+Qt7y+tVHJyoqbtiTrcBpvMb0/g/7OFYLFeYKAwJiEBQ0g5PHZ2xUiAZ4d4QDpzGti5agE0NCVvG50g2EZTvN0g6JRAbdKYx3wpvwt4upDtyzXsT9BhXPjLWGUmETyT/ph97jOMH1+dM77t9qdPyAaj6/5a5wOOC1BqP3NtZozTjNOUg8FYsn0N3M7GosNBGCR+pFBeTClfZrrqbmJ3Fwls9xIDj2CntyE3mex8 4j/Vr0wz iqH9k++LLwbndpiAAEJhZzu4IiH8Lfgb98JPl2Bt7VH0ozK5xxFhqC1iymPd9NZHwXlIMuWRK2mTItdkI33lYQt2Oyt+NVCDUChQjO3B9URa8L6R72SZJFlLZBcNhSngLRIKeoYWe/5+06Z8wIVorDnYcGVXW+ck91nkusu2jxDHJG5N6Wbnm+K0fPKlQGHKm65GgUgozXs/XNKdcDVrFLs4P6w0Vb5L9Ddb1ju+nIZNTtfayqJHuSux4wG59AuzaomBXt+wGwAgnTlQTQQzOvfP/pw2X7P/Fm7hShvW6CusU9jfkj4FHqf6TIMkBwmoVpDhSXyHASs6omiSNLmzs9Z3n6jjMbZT3SDiy X-Bogosity: Ham, tests=bogofilter, spamicity=0.000000, version=1.2.4 Sender: owner-linux-mm@kvack.org Precedence: bulk X-Loop: owner-majordomo@kvack.org List-ID: List-Subscribe: List-Unsubscribe: --Apple-Mail=_BCE844C3-88DD-44DB-8610-874CA9F71D0D Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset=utf-8 > On Jun 30, 2025, at 12:30=E2=80=AFPM, Uladzislau Rezki = wrote: >=20 > On Sat, Jun 28, 2025 at 12:25:37PM +0200, Vitaly Wool wrote: >> 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. >>=20 >> With that change we also provide the ability for the Rust part of >> the kernel to set node and aligmnent in its allocations. >>=20 >> Signed-off-by: Vitaly Wool >> --- >> include/linux/vmalloc.h | 12 +++++++++--- >> mm/vmalloc.c | 20 ++++++++++++++++---- >> 2 files changed, 25 insertions(+), 7 deletions(-) >>=20 >> diff --git a/include/linux/vmalloc.h b/include/linux/vmalloc.h >> index fdc9aeb74a44..68791f7cb3ba 100644 >> --- a/include/linux/vmalloc.h >> +++ b/include/linux/vmalloc.h >> @@ -197,9 +197,15 @@ extern void *__vcalloc_noprof(size_t n, size_t = size, gfp_t flags) __alloc_size(1 >> extern void *vcalloc_noprof(size_t n, size_t size) __alloc_size(1, = 2); >> #define vcalloc(...) alloc_hooks(vcalloc_noprof(__VA_ARGS__)) >>=20 >> -void * __must_check vrealloc_noprof(const void *p, size_t size, = gfp_t flags) >> - __realloc_size(2); >> -#define vrealloc(...) = alloc_hooks(vrealloc_noprof(__VA_ARGS__)) >> +void *__must_check vrealloc_node_align_noprof(const void *p, size_t = size, >> + unsigned long align, gfp_t flags, int nid) = __realloc_size(2); >> +#define vrealloc_node_noprof(_p, _s, _f, _nid) \ >> + vrealloc_node_align_noprof(_p, _s, 1, _f, _nid) >> +#define vrealloc_noprof(_p, _s, _f) \ >> + vrealloc_node_align_noprof(_p, _s, 1, _f, NUMA_NO_NODE) >> +#define vrealloc_node_align(...) = alloc_hooks(vrealloc_node_align_noprof(__VA_ARGS__)) >> +#define vrealloc_node(...) = alloc_hooks(vrealloc_node_noprof(__VA_ARGS__)) >> +#define vrealloc(...) = alloc_hooks(vrealloc_noprof(__VA_ARGS__)) >>=20 >> extern void vfree(const void *addr); >> extern void vfree_atomic(const void *addr); >> diff --git a/mm/vmalloc.c b/mm/vmalloc.c >> index 6dbcdceecae1..d633ac0ff977 100644 >> --- a/mm/vmalloc.c >> +++ b/mm/vmalloc.c >> @@ -4089,12 +4089,15 @@ void *vzalloc_node_noprof(unsigned long size, = int node) >> EXPORT_SYMBOL(vzalloc_node_noprof); >>=20 >> /** >> - * 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 id >> * >> - * If @p is %NULL, vrealloc() behaves exactly like vmalloc(). If = @size is 0 and >> + * 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 __GFP_ZERO logic is requested, callers must ensure that, = starting with the >> @@ -4111,7 +4114,8 @@ EXPORT_SYMBOL(vzalloc_node_noprof); >> * 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) >> +void *vrealloc_node_align_noprof(const void *p, size_t size, = unsigned long align, >> + gfp_t flags, int nid) >> { >> struct vm_struct *vm =3D NULL; >> size_t alloced_size =3D 0; >> @@ -4135,6 +4139,13 @@ void *vrealloc_noprof(const void *p, size_t = size, gfp_t flags) >> if (WARN(alloced_size < old_size, >> "vrealloc() has mismatched area vs requested = sizes (%p)\n", p)) >> return NULL; >> + if (WARN(nid !=3D NUMA_NO_NODE && nid !=3D = page_to_nid(vmalloc_to_page(p)), >> + "vrealloc() has mismatched nids\n")) >> + return NULL; >> + if (WARN((uintptr_t)p & (align - 1), >> + "will not reallocate with a bigger alignment = (0x%lx)\n", >> + align)) >> + return NULL; >>=20 > IMO, IS_ALIGNED() should be used instead. We have already a macro for = this > purpose, i.e. the idea is just to check that "p" is aligned with = "align" > request. >=20 > Can you replace the (uintptr_t) casting to (ulong) or (unsigned long) > this is how we mostly cast in vmalloc code? Thanks, noted. >=20 > WARN() probably is worth to replace. Use WARN_ON_ONCE() to prevent > flooding. I am not sure i totally agree, because: a) there=E2=80=99s already one WARN() in that block and I=E2=80=99m just = following the pattern b) I don=E2=80=99t think this will be a frequent error. ~Vitaly --Apple-Mail=_BCE844C3-88DD-44DB-8610-874CA9F71D0D Content-Transfer-Encoding: quoted-printable Content-Type: text/html; charset=utf-8

On Jun 30, 2025, at 12:30=E2=80=AFPM, Uladzislau = Rezki <urezki@gmail.com> wrote:

On Sat, Jun 28, 2025 at 12:25:37PM +0200, = Vitaly Wool wrote:
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 aligmnent in its = allocations.

Signed-off-by: Vitaly Wool = <vitaly.wool@konsulko.se>
---
include/linux/vmalloc.h | 12 = +++++++++---
mm/vmalloc.c =            | 20 = ++++++++++++++++----
2 files changed, 25 insertions(+), 7 = deletions(-)

diff --git a/include/linux/vmalloc.h = b/include/linux/vmalloc.h
index fdc9aeb74a44..68791f7cb3ba = 100644
--- a/include/linux/vmalloc.h
+++ = b/include/linux/vmalloc.h
@@ -197,9 +197,15 @@ extern void = *__vcalloc_noprof(size_t n, size_t size, gfp_t flags) = __alloc_size(1
extern void *vcalloc_noprof(size_t n, size_t size) = __alloc_size(1, 2);
#define vcalloc(...) = alloc_hooks(vcalloc_noprof(__VA_ARGS__))

-void * = __must_check vrealloc_noprof(const void *p, size_t size, gfp_t = flags)
- = = __realloc_size(2);
-#define vrealloc(...) = alloc_hooks(vrealloc_noprof(__VA_ARGS__))
+void *__must_check = vrealloc_node_align_noprof(const void *p, size_t size,
+ unsigned = long align, gfp_t flags, int nid) __realloc_size(2);
+#define = vrealloc_node_noprof(_p, _s, _f, _nid) \
+ = vrealloc_node_align_noprof(_p, _s, 1, _f, _nid)
+#define = vrealloc_noprof(_p, _s, _f) \
+ = vrealloc_node_align_noprof(_p, _s, 1, _f, = NUMA_NO_NODE)
+#define vrealloc_node_align(...) = alloc_hooks(vrealloc_node_align_noprof(__VA_ARGS__))
+#define = vrealloc_node(...) = alloc_hooks(vrealloc_node_noprof(__VA_ARGS__))
+#define = vrealloc(...) = = = = alloc_hooks(vrealloc_noprof(__VA_ARGS__))

extern void = vfree(const void *addr);
extern void vfree_atomic(const void = *addr);
diff --git a/mm/vmalloc.c b/mm/vmalloc.c
index = 6dbcdceecae1..d633ac0ff977 100644
--- a/mm/vmalloc.c
+++ = b/mm/vmalloc.c
@@ -4089,12 +4089,15 @@ 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 id
 *
- * If @p is %NULL, = vrealloc() behaves exactly like vmalloc(). If @size is 0 and
+ * 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 __GFP_ZERO logic is requested, callers = must ensure that, starting with the
@@ -4111,7 +4114,8 @@ = EXPORT_SYMBOL(vzalloc_node_noprof);
 * Return: pointer to the = allocated memory; %NULL if @size is zero or in case of
 * =         failure
 */
-vo= id *vrealloc_noprof(const void *p, size_t size, gfp_t flags)
+void = *vrealloc_node_align_noprof(const void *p, size_t size, unsigned long = align,
+ = = = =  gfp_t flags, = int nid)
{
struct vm_struct *vm =3D NULL;
size_t = alloced_size =3D 0;
@@ -4135,6 +4139,13 @@ void = *vrealloc_noprof(const void *p, size_t size, gfp_t flags)
if = (WARN(alloced_size < old_size,
 "vrealloc() has mismatched = area vs requested sizes (%p)\n", p))
return NULL;
+ if = (WARN(nid !=3D NUMA_NO_NODE && nid !=3D = page_to_nid(vmalloc_to_page(p)),
+  "vrealloc() has mismatched = nids\n"))
+ return NULL;
+ if (WARN((uintptr_t)p & = (align - 1),
+  "will = not reallocate with a bigger alignment (0x%lx)\n",
+  align))
+ return = NULL;

IMO, = IS_ALIGNED() should be used instead. We have already a macro for = this
purpose, i.e. the idea = is just to check that "p" is aligned with "align"
request.

Can you = replace the (uintptr_t) casting to (ulong) or (unsigned long)
this is how we mostly cast in vmalloc = code?

Thanks, noted.

WARN() probably is worth = to replace. Use WARN_ON_ONCE() to prevent
flooding.

I am not = sure i totally agree, because:
a) there=E2=80=99s already one = WARN() in that block and I=E2=80=99m just following the = pattern
b) I don=E2=80=99t think this will be a frequent = error.

~Vitaly

= --Apple-Mail=_BCE844C3-88DD-44DB-8610-874CA9F71D0D--